2010-02-23 11 views
21

Próbuję uzyskać zawartość etykiety, która będzie wiązała się z właściwością string instancji klasy bez większego powodzenia.WPF: Wiązanie etykiety z właściwością klasy

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

czyli po kliknięciu przycisku ustawić właściwości MyFoo do "Hello" i "Dave" i chcesz to odzwierciedlenie w etykiety w interfejsie użytkownika. Ustawiłem treść jako powiązanie, ale coś jest nie tak. Co ja tu robię źle?

Odpowiedz

18

Możesz dokonać MyFoo właściwości zależnościach i ustawić DataContext z wystąpieniem Window1:

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

Zobacz ten article więcej szczegółów.

Dokonywanie MyFoo właściwość zależności nie jest obowiązkowe. może działać z samą właściwością, jeśli ustawisz wartość właściwości przed przypisując wartość . (Ale nigdy z polem.) Jeśli jednak chcesz, aby etykiety zmieniały wartości W1 i W2 (lub nie wiesz/nie przejmuj się, jeśli wartości są ustawione przed lub po przypisaniu DataContect), potrzebujesz Foo do być albo DependencyObject, albo implementować interfejs INotifyPropertyChanged.

+1

Dzięki, ten wskazał mnie we właściwym kierunku. Wykonane narzędzie Foo INotifyPropertyChanged, a następnie ustaw DataContext okna Window1 na wartość BindingList , która zawiera MyFoo. Zawartość etykiety jest teraz: {Ścieżka powiązania = W1, UpdateSourceTrigger = PropertyChanged} I działa jak uczta! – Gareth

+1

@ Vlad Jaka byłaby różnica między używaniem 'DependencyProperty' i implementacją' INotifyPropertyChanged', czy też powinno to być pytanie samo w sobie? – ywm

+0

@ymw: to inne pytanie, w rzeczywistości dość duże. W skrócie: oba będą działać tylko dla wiązania, ale 'INotifyPropertyChanged' jest bardziej lekki,' DependencyProperty' jednak nie bierze pamięci, jeśli nie jest używany i może być używany do animacji, stylizacji, szablonów, być dziedziczony (od kontenera macierzystego do zawartego element) i wiele więcej. Zobacz na przykład [ta odpowiedź] (http://stackoverflow.com/a/3674530/276994). – Vlad

6

Albo dać okna nazwę: jak NameOfWindow i używać ElementName oprawa:

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

próbkę kompletnego 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" 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

to nie działa. – AnjumSKhan