2009-08-18 3 views
0
<StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3" 
    DataContext="{Binding Mode=OneWay, Source={StaticResource local:oPatients}}"> 

Ich bekomme StaticResource Verweis 'local: oPatients' wurde nicht gefunden. HierWPF - Wer weiß, warum ich diese verbindliche Referenz nicht bekommen kann?

ist der Code-Behind:

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 
    clsPatients oPatients; 

    public MainWindow() 
    { 
     oPatients = new clsPatients(true); 

... 
+0

Ihr Benutzername zeigt als „unbekannt“, Sie möchten Ihre Benutzer bearbeiten Profil. –

+0

Als ich anfing fragte nach meinem Google-Konto oder etwas und das ist, was passiert ist ... Ich werde daran arbeiten! ;) – LSTayon

Antwort

2

Um das Objekt als StaticResource zu adressieren, muss es in einem Ressourcenverzeichnis sein. Da Sie jedoch das Objekt in MainWindow Konstruktor erstellen, können Sie die DataContext im Code-Behind wie folgt festlegen.

oPatients = new clsPatients(true); 
stkWaitingPatients.DataContext = oPatients; 

Und dann die Binding dazu ändern:

{Binding Mode=OneWay} 

Dies ist eine oke Praxis, wenn du gehst, um nicht wieder die DataContext ändern, sonst würden Sie eine flexiblere Lösung wollen.

Bearbeiten: Sie erwähnt ObjectDataProvider in Ihrem Kommentar. Hier ist, wie Sie das tun würden. Zuerst eine xmlns:sys zum Window für den System Namespace hinzufügen (ich nehme an, Sie bereits eine für xmlns:local haben):

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

Dann können Sie eine ObjectDataProvider auf Ihre Ressource-Wörterbuch wie folgt hinzu:

<Window.Resources> 
    <ObjectDataProvider 
     x:Key="bindingPatients" 
     ObjectType="{x:Type local:clsPatients}"> 
     <ObjectDataProvider.ConstructorParameters> 
      <sys:Boolean>True</sys:Boolean> 
     </ObjectDataProvider.ConstructorParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

Und siehe es in einem Binding mit dem StaticResource Markup wie diese, die gleiche Zeichenfolge verwenden wir in der x:Key angebracht Eigenschaft angegeben wir es im Wörterbuch gab:

{Binding Source={StaticResouce bindingPatients}, Mode=OneWay} 

Edit 2: Ok, geschrieben Sie mehr Code in Ihrer Antwort, und jetzt weiß ich, warum es eine Ausnahme während des Konstruktor werfen. Sie versuchen, dies zu tun ...

lstWaitingPatients.DataContext = oPatients; 

... aber lstWaitingPatients eigentlich nicht existiert, bis nach this.InitializeComponent() beendet. InitializeComponent() lädt den XAML und macht eine Menge anderer Dinge. Sofern Sie nicht vorher etwas tun müssen, setzen Sie den benutzerdefinierten Startcode nach den Anruf an InitalizeComponent() oder in einem Ereignishandler für Loaded Ereignis.

+0

Ich versuche einfach, den Datenkontext in den Codebehind zu verschieben, so dass ich Fehler abfangen kann (wie eine schlechte Verbindungszeichenfolge) und dann auf eine benutzerfreundliche Fehlerseite gehe ... konnte nicht herausfinden, wie das geht Verwenden von und ObjectDataSource in XAML ... Probieren Sie das jetzt ... – LSTayon

+0

Nein, ich bekomme eine generische "Kann Instanz von Windows nicht erstellen" ... kann ich Ihnen mehr Code senden? Das macht mich verrückt! – LSTayon

+0

Das heißt, Sie haben eine Ausnahme während 'Window's Konstruktor, wahrscheinlich aufgrund eines Fehlers in der XAML. Das Senden von mehr Code wird Ihnen nicht helfen, da Sie Ihren Code sehen werden. Hast du 'xmlns: sys' in das' Window'-Tag eingefügt? Gab es bereits eine '' und jetzt sind es 2? Es gibt viele Dinge, die es sein könnte. –

0

Jetzt kann ich das nicht zum Funktionieren bringen ... Ich bekomme einen allgemeinen Windows-Startfehler. Hier

ist die Code-Behind mit dem Initializer und die Klasse instanziiert wird:

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 

    public MainWindow() 
    { 
     clsPatients oPatients = new clsPatients(true); 
     lstWaitingPatients.DataContext = oPatients; 

     this.InitializeComponent(); 

Hier ist die Spitze meiner XAML:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:Orista_Charting" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
x:Class="Orista_Charting.MainWindow" 
x:Name="windowMain" 
Title="Orista Chart" 
Width="1024" Height="768" Topmost="True" WindowStartupLocation="CenterScreen" Activated="MainWindow_Activated" > 


<Window.Resources>   

    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources/ButtonStyles.xaml"/> 
      <ResourceDictionary Source="Resources/OtherResources.xaml"/> 
      <ResourceDictionary Source="Resources/TextBlockStyles.xaml"/> 
      <ResourceDictionary Source="Resources/Converters.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 

Hier ist die relevante XAML, wie Sie sehen, ich ging voran und den DataContext vom StackPanel nach unten in die ListBox verschoben.Das läuft nicht, aber es macht in der Entwurfsansicht (jedoch ohne Daten in der List-Box):

<!-- Waiting Patients List --> 
    <Border BorderThickness="1,1,1,1" BorderBrush="#FF000000" Padding="10,10,10,10" 
      CornerRadius="10,10,10,10" Background="#FFFFFFFF" Margin="15.245,187.043,0,41.957" HorizontalAlignment="Left" > 
     <StackPanel x:Name="stkWaitingPatients" Width="300" Margin="0,0,0,-3"> 

      <StackPanel Orientation="Horizontal">  
       <TextBlock Text="Waiting Patients:" VerticalAlignment="Center" FontSize="21.333" Margin="0,0,0,20"/> 
       <TextBlock HorizontalAlignment="Right" Margin="0,0,38.245,0" Width="139" Height="16" 
       Text="Minutes Waiting" TextWrapping="Wrap" Foreground="#FF9C2525" FontWeight="Bold" VerticalAlignment="Bottom" 
       TextAlignment="Right"/> 
       <!-- Too be implemented, this is the wait animation --> 
       <!--<Image x:Name="PollGif" Visibility="{Binding Loading}" 
         HorizontalAlignment="Left" Margin="100,0,0,0" Width="42.5" Height="42.5" 
         Source="Images/loading-gif-animation.gif" Stretch="Fill"/>-->  
      </StackPanel>     

      <ListBox x:Name="lstWaitingPatients"  
        DataContext="{Binding Mode=OneWay}" ItemsSource="{Binding Mode=OneWay}" 
        IsSynchronizedWithCurrentItem="true" 
        ItemTemplate="{StaticResource WaitingPatientsItemTemplate}" 
        FontSize="21.333" Height="423.291" ScrollViewer.VerticalScrollBarVisibility="Visible" 
        GotFocus="lstWaitingPatients_GotFocus" 
        /> 

     </StackPanel> 
    </Border> 

Ok, aber wenn ich die assigment Linie in dem Code-Behind nur nimmst auf Kommentar, es tut run (wenn auch ohne Daten in der Listbox):

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 

    public MainWindow() 
    { 
     clsPatients oPatients = new clsPatients(true); 
     //lstWaitingPatients.DataContext = oPatients; 

DANKE!

+0

Wie sixlettervariables Notizen in seiner Antwort, Sie brauchen einige der Bindungen, die Sie tun, auf der 'ListBox'. –

1

Die folgenden Sätze die Itemssource in Code-behind und Griffe korrekt das Databinding:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     clsPatients oPatients = new clsPatients(true); 

     //assuming oPatients implements IEnumerable 
     this.lstWaitingPatients.ItemsSource = oPatients; 

Und das XAML:

<ListBox x:Name="lstWaitingPatients"  
     IsSynchronizedWithCurrentItem="true" 
     ItemTemplate="{StaticResource WaitingPatientsItemTemplate}" 
     FontSize="21.333" Height="423.291" 
     ScrollViewer.VerticalScrollBarVisibility="Visible" 
     GotFocus="lstWaitingPatients_GotFocus" 
     /> 
+0

Aber ich würde mit dem ObjectDataProvider von @ Joel Antwort gehen. – user7116

Verwandte Themen