2010-02-23 15 views
21

Sto cercando di ottenere il contenuto di un'etichetta per associare alla proprietà stringa di un'istanza di classe senza molto successo.WPF: Associazione di un'etichetta a una proprietà di classe

XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" /> 

    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W2}" VerticalAlignment="Top" /> 

    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" 
      Name="button1" VerticalAlignment="Bottom" Width="89" 
      Click="button1_Click"> 
     Set Properties 
    </Button> 

</Grid> 
</Window> 

C#:

namespace WPFBindingTest 
{ 
    public partial class Window1 : Window 
    { 
     public Foo MyFoo; 

     public Window1() 
     { 
      InitializeComponent();    

      MyFoo = new Foo();   
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     {  
      MyFoo.W1 = "Hello"; 
      MyFoo.W2 = "Dave"; 
     } 
    } 

    public class Foo 
    { 
     public string W1 { get; set; } 
     public string W2 { get; set; } 
    } 
} 

cioè quando clicco il bottone, ho impostato le proprietà di MyFoo a "Ciao" e "Dave", e voglio che riflette nella etichette sull'interfaccia utente. Ho impostato il contenuto come vincolante ma qualcosa non è giusto. Cosa sto facendo di sbagliato qui?

risposta

18

Si può rendere la vostra una proprietà di dipendenza MyFoo e impostare la DataContext al Window1 esempio:

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

Vai a questa article per maggiori dettagli.

Fare una proprietà di dipendenza non è obbligatoria. MyFoo. può funzionare solo con una proprietà se si imposta il valore della proprietà prima dello assegnando lo DataContext. (Ma mai con un campo.) Tuttavia se si desidera che le etichette raccolgano i valori di variazione di W1 e W2 (o non si conosce/cura se i valori sono impostati prima o dopo l'assegnazione di DataContect), è necessario Foo a può essere un DependencyObject o implementare l'interfaccia INotifyPropertyChanged.

+1

Grazie, questo mi ha segnalato nella giusta direzione. Made Foo implementa INotifyPropertyChanged, quindi imposta il DataContext di Window1 su quello di BindingList , che contiene MyFoo. Il contenuto dell'etichetta è ora: {Percorso obbligatorio = W1, UpdateSourceTrigger = PropertyChanged} E funziona a meraviglia! – Gareth

+1

@Vlad Qual è la differenza tra l'utilizzo di 'DependencyProperty' e l'implementazione di' INotifyPropertyChanged' o dovrebbe essere una questione di se stesso? – ywm

+0

@ymw: questa è una domanda diversa, in effetti piuttosto grande. In breve: entrambi funzioneranno solo per il binding, ma 'INotifyPropertyChanged' è più leggero,' DependencyProperty' tuttavia non occupa la memoria se non viene utilizzato e può essere utilizzato per animazioni, stili, modelli, ereditari (dal contenitore principale al contenuto elemento) e molto altro. Vedi ad esempio [questa risposta] (http://stackoverflow.com/a/3674530/276994). – Vlad

6

O dare la vostra finestra un nome: come NameOfWindow e utilizzare un ElementName vincolante:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" 

completo XAML campione:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Name="NameOfWindow">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button> 
</Grid> 
+1

questo non funziona. – AnjumSKhan

Problemi correlati