2010-02-23 2 views
21

Я пытаюсь получить содержимое метки для привязки к строковому свойству экземпляра класса без особого успеха.WPF: привязка метки к свойству класса

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

т.е. когда я нажимаю кнопку, я установить свойство MYFOO на "Hello" и "Dave", и хочу, что отражено в ярлыки в пользовательском интерфейсе. Я установил Content как привязку, но что-то не так. Что я здесь делаю неправильно?

ответ

18

Вы можете сделать свое свойство зависимостей MyFoo и установить DataContext к вашим Window1 например:

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

article Смотреть это для более подробной информации.

Создание MyFoo свойство зависимости не является обязательным. он может работать только с имуществом, если вы установили значение свойства до, назначив DataContext. (Но никогда не с полем.) Однако, если вы хотите, чтобы метки отображали изменяющиеся значения W1 и W2 (или вы не знаете/не заботитесь, установлены ли значения до или после назначения DataContect), вам необходимо Foo быть либо DependencyObject, либо реализовать интерфейс INotifyPropertyChanged.

+1

Спасибо, это указал мне в правильном направлении. Сделано Foo реализовать INotifyPropertyChanged, а затем установить DataContext Window1 в значение BindingList , в котором содержится MyFoo. Содержимое метки теперь: {Binding Path = W1, UpdateSourceTrigger = PropertyChanged} И это работает! – Gareth

+1

@ Vlad. В чем разница между использованием 'DependencyProperty' и внедрением' INotifyPropertyChanged', или это должно быть вопросом самого себя? – ywm

+0

@ymw: это другой вопрос, на самом деле довольно большой. Короче говоря: оба будут работать только для привязки, но 'INotifyPropertyChanged' является более легким,' DependencyProperty', однако, не принимает память, если не используется, и может использоваться для анимаций, стилей, шаблонов, наследоваться (от родительского контейнера до содержащегося элемент) и многое другое. См. Например [этот ответ] (http://stackoverflow.com/a/3674530/276994). – Vlad

6

Или дайте ваше окно имя: как NameOfWindow и использовать ELEMENTNAME связывания:

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

Полный пример 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

это не работает. – AnjumSKhan

Смежные вопросы