WPF: привязка метки к свойству класса - PullRequest
23 голосов
/ 23 февраля 2010

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

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» и хочу, чтобы это отражалось в метках пользовательского интерфейса. Я установил Контент как обязательный, но что-то не так. Что я здесь не так делаю?

Ответы [ 2 ]

20 голосов
/ 23 февраля 2010

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

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

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

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

7 голосов
/ 23 февраля 2010

Или дайте вашему окну имя: например 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...