C # associazione dati non aggiorna WPF
-
21-08-2019 - |
Domanda
Sto cercando di fare una associazione dati nel codice # C dietro piuttosto che il XAML. Il XAML legame creato in Expression Blend 2 al mio oggetto CLR funziona bene. Il mio C # applicazione aggiorna solo quando viene avviata l'applicazione dopo che le successive modifiche al CLR non aggiornare il mio tenore di etichetta.
Ecco il codice XAML di lavoro vincolante. In primo luogo un'ObjectDataProvider è fatto nei miei Window.Resources.
<ObjectDataProvider x:Key="PhoneServiceDS"
ObjectType="{x:Type kudu:PhoneService}" d:IsDataSource="True"/>
E il contenuto etichetta vincolante:
<Label x:Name="DisplayName" Content="{Binding
Path=MyAccountService.Accounts[0].DisplayName, Mode=OneWay,
Source={StaticResource PhoneServiceDS}}"/>
Funziona alla grande. Ma noi vogliamo questo set up in C # in modo che possiamo cambiare in modo indipendente l'XAML (es. Nuove skin). Il mio unico orario di lavoro C # come segue:
Binding displayNameBinding = new Binding();
displayNameBinding.Source =
PhoneService.MyAccountService.Accounts[0].DisplayName;
displayNameBinding.Mode = BindingMode.OneWay;
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);
Questa è dentro la mia MainWindow dopo InitializeComponent ();
Tutta la comprensione il motivo per cui questo funziona solo all'avvio?
Soluzione
La versione C # non corrisponde alla versione XAML. Dovrebbe essere possibile scrivere una versione del codice di markup, anche se io non ho familiarità con ObjectDataProvider.
Provare qualcosa di simile a questo:
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);
Altri suggerimenti
Nel codice priginal hai confuso l'origine e il percorso.
Binding displayNameBinding = new Binding();
displayNameBinding.Source = PhoneService;
displayNameBinding.Path = "MyAccountService.Accounts[0].DisplayName";
displayNameBinding.Mode = BindingMode.OneWay;
this.DisplayName.SetBinding(Label.ContentProperty, displayNameBinding);
(presumo PhoneService è un'istanza oggetto, altrimenti forse PhoneService. MyAccountService.Accounts [0] dovrebbe essere la fonte?)
Da memoria, è possibile passare il percorso come un argomento al costruttore.
Scrivi questo all'interno evento Loaded, invece di costruttore. Spero che implmented INotifyPropertyChanged innescato sulla proprietà setter DisplayName?