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}}"> 

Je reçois la référence StaticResource 'local: oPatients' introuvable.WPF - Quelqu'un sait pourquoi je ne peux pas obtenir cette liaison à référence?

Voici le codebehind:

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

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

... 
+0

Votre nom d'utilisateur montre « inconnu », vous pouvez modifier votre utilisateur profil. –

+0

Quand j'ai commencé, j'ai demandé mon compte google ou quelque chose et c'est ce qui s'est passé ... Je vais y travailler! ;) – LSTayon

Répondre

2

Pour être en mesure de traiter l'objet en tant que StaticResource, il doit être dans un dictionnaire de ressources. Toutefois, puisque vous créez l'objet dans le constructeur MainWindow, vous pouvez définir le DataContext dans le code-behind comme si.

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

Et puis changer le Binding à ceci:

{Binding Mode=OneWay} 

Ceci est une pratique ok si vous n'allez être changer à nouveau le DataContext, sinon vous voudriez une solution plus souple.

Editer: Vous avez mentionné ObjectDataProvider dans votre commentaire. Voici comment vous feriez cela. Tout d'abord, ajouter un xmlns:sys au Window pour l'espace de noms System (je suppose que vous avez déjà un pour xmlns:local):

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

Ensuite, vous pouvez ajouter un ObjectDataProvider à votre dictionnaire de ressources comme celui-ci:

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

Et y faire référence dans un Binding avec le balisage StaticResource comme ceci, en utilisant la même chaîne que nous avons spécifié dans la propriété x:Key ci-jointe nous l'avons donné dans le dictionnaire:

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

Edit 2: Ok, vous avez affichée plus de code dans votre réponse, et je sais maintenant pourquoi il lance une exception au cours du constructeur. Vous essayez de le faire ...

lstWaitingPatients.DataContext = oPatients; 

... mais lstWaitingPatients n'existe pas réellement qu'après this.InitializeComponent() finitions. InitializeComponent() charge le XAML et fait un tas d'autres choses. Sauf si vous avez vraiment besoin de faire quelque chose avant tout cela, mettez le code de démarrage personnalisé après l'appel à InitalizeComponent() ou dans un gestionnaire d'événement pour WindowLoaded événement.

+0

J'essaie simplement de déplacer le datacontext vers le codebehind afin que je puisse piéger des erreurs (comme une mauvaise chaîne de connexion) et ensuite passer à une page d'erreur facile à utiliser ... ne pouvait pas comprendre comment faire cela using et ObjectDataSource en XAML ... Essayant ceci maintenant ... – LSTayon

+0

Non, je reçois un générique "ne peut pas créer l'instance de la fenêtre" ... puis-je vous envoyer plus de code? Ça me rend dingue! – LSTayon

+0

Cela signifie que vous avez une exception survenue pendant le constructeur de 'Window', probablement en raison d'un bug dans le XAML. Vous envoyer plus de code n'aidera pas, voyant votre code sera. Avez-vous mis 'xmlns: sys' dans la balise' Window'? Y avait-il déjà un '' et maintenant il y en a 2? Il y a beaucoup de choses que ça pourrait être. –

0

Maintenant, je n'arrive pas à faire fonctionner ça ... Je reçois une erreur de démarrage Windows générale.

Voici le codebehind avec le Initializer et la classe instanciée:

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 

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

     this.InitializeComponent(); 

est ici le haut de mon 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> 

Voici le XAML pertinent, comme vous le voyez, je suis allé de l'avant et déplacé le DataContext vers le ListBox à partir du StackPanel.Cela ne fonctionne pas, mais il ne rend en mode Création (cependant, sans données présentes dans la zone de liste):

<!-- 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, mais si je prends juste un commentaire sur la ligne de assigment dans le behind, il ne exécution (bien que sans données dans la zone de liste):

public partial class MainWindow : Window 
{ 
    ListBox _activeListBox; 

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

MERCI!

+0

Comme des notes de sixlettervariables dans sa réponse, vous n'avez pas besoin de certaines des liaisons que vous faites sur le 'ListBox'. –

1

Le texte qui suit le ItemsSource dans le code derrière et est capable de traiter le DataBinding:

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

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

Et le XAML:

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

Mais, j'irais avec le ObjectDataProvider de la réponse @ Joel. – user7116

Questions connexes