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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top