2008-12-10 10 views
4

J'essaie de faire une liaison de données dans le code C# derrière plutôt que le XAML. La liaison XAML créée dans Expression Blend 2 vers mon objet CLR fonctionne correctement. Mon implémentation C# est mise à jour uniquement lorsque l'application est démarrée, après quoi les modifications ultérieures du CLR ne mettent pas à jour le contenu de mon libellé.La liaison de données C# ne se met pas à jour WPF

Voici la liaison XAML qui fonctionne. D'abord, un objet ObjectDataProvider est créé dans mon Window.Resources.

<ObjectDataProvider x:Key="PhoneServiceDS" 
    ObjectType="{x:Type kudu:PhoneService}" d:IsDataSource="True"/> 

Et le contenu de l'étiquette de liaison:

<Label x:Name="DisplayName" Content="{Binding 
    Path=MyAccountService.Accounts[0].DisplayName, Mode=OneWay, 
    Source={StaticResource PhoneServiceDS}}"/> 

Fonctionne très bien. Mais nous voulons que cette configuration soit en C# afin que nous puissions changer indépendamment le XAML (c'est-à-dire les nouveaux skins). Mon un temps de travail C# comme suit:

 Binding displayNameBinding = new Binding(); 
    displayNameBinding.Source = 
     PhoneService.MyAccountService.Accounts[0].DisplayName; 
    displayNameBinding.Mode = BindingMode.OneWay; 
    this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 

C'est dans mon MainWindow après InitializeComponent();

Un aperçu pourquoi cela ne fonctionne que sur le démarrage? Ecrivez ceci à l'intérieur de l'événement Loaded au lieu du constructeur.

Répondre

3

Votre version C# ne correspond pas à la version XAML. Il devrait être possible d'écrire une version de code de votre balisage, même si je ne suis pas familier avec ObjectDataProvider.

Essayez quelque chose comme ceci:

Binding displayNameBinding = new Binding("MyAccountService.Accounts[0].DisplayName"); 
displayNameBinding.Source = new ObjectDataProvider { ObjectType = typeof(PhoneService), IsDataSource = true }; 
displayNameBinding.Mode = BindingMode.OneWay; 
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 
+0

Je voudrais remplacer displayNameBinding.Source avec un appel à this.TryFindResource ("PhoneServiceDS") donc c'est exactement équivalent à son XAML, mais sinon j'étais sur le point de poster une solution comme ça. –

+0

La méthode TryFindResource a fonctionné avec l'ObjectDataSource déclarée en XAML. J'ai trouvé que ODS est comme faire une instance de n'importe quel objet que je veux utiliser, ainsi la définition de ma source de liaison à PhoneService que j'ai instanciée a déjà fonctionné. Merci! – Jippers

0

Vous espérez implémenter INotifyPropertyChanged déclenché sur le setter de propriété DisplayName?

1

Dans le code priginal vous avez confondu la source et le chemin.

 Binding displayNameBinding = new Binding(); 
    displayNameBinding.Source = PhoneService; 
    displayNameBinding.Path = "MyAccountService.Accounts[0].DisplayName"; 
    displayNameBinding.Mode = BindingMode.OneWay; 
    this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding); 

(je suppose PhoneService est une instance d'objet, sinon peut-être PhoneService. MyAccountService.Accounts [0] devrait être la source?)

De mémoire, vous pouvez passer le chemin comme argument au constructeur .

Questions connexes