Привязка данных WPF к стандартным свойствам CLR в коде - PullRequest
3 голосов
/ 28 мая 2010

Просто изучаю привязку данных WPF и пробел в моем понимании. Я видел несколько похожих вопросов о StackOverflow, но я все еще пытаюсь определить, что я сделал неправильно.

У меня есть простой класс Person со свойством Имя и Фамилия (стандартные свойства CLR). У меня также есть стандартное свойство CLR в моем классе Window, которое предоставляет экземпляр Person.

Затем я получил XAML с двумя способами привязки. Первый работает, второй нет. Кто-нибудь может помочь мне понять, почему второй метод не работает? В журнале вывода нет сообщения об ошибке привязки.

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300"
    DataContext="{Binding RelativeSource={RelativeSource Self}, Path=MyPerson}">
<StackPanel>
    <Label>My Person</Label>
    <WrapPanel>
        <Label>First Name:</Label>
        <Label Content="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=MyPerson.FirstName}"></Label>
    </WrapPanel>
    <WrapPanel>
        <Label>Last Name:</Label>
        <Label Content="{Binding MyPerson.Surname}"></Label>
    </WrapPanel>
</StackPanel>

Редактировать: Хорошо, пока спасибо. Я изменил второе выражение на:

<Label Content="{Binding Surname}"></Label>

Хотя я до сих пор не могу заставить его работать!

Ответы [ 4 ]

2 голосов
/ 28 мая 2010

Хорошо, я обнаружил проблему здесь. Новичок в WPF, поэтому мне потребовалось некоторое время, чтобы понять это.

В коде позади я устанавливаю свойство MyPerson после вызова InitializeComponent.

Первый метод, который я использовал, работает, потому что окно инициализируется и свойство MyPerson устанавливается к моменту инициализации метки и оценивается выражение привязки данных.

Второй метод не работает, потому что свойство MyPerson не было установлено, когда инициализируется Window и связанный DataContext.

Просто, когда знаешь как!

1 голос
/ 28 мая 2010

Во-первых, большую часть времени вы не увидите ошибок привязки, если не настроите диагностику для этой привязки.Причина, по которой второй не работает, заключается в том, что для DataContext установлено значение MyPerson.Поскольку это DataContext, все, что вам нужно сделать, это привязать к свойству Фамилия.Теперь у вас есть попытка вызвать MyPerson.MyPerson.Sameame.

1 голос
/ 28 мая 2010

Для работы второго метода вам просто нужно

<Label Content="{Binding Surname}"/>

потому что вы уже установили DataContext на человека в элементе окна вверху.

Верхний текстовый текст работает для меня, однако привязка не отображается в конструкторе, если у меня нет отдельного класса, содержащего данные. Чтобы это работало, вы должны сделать что-то вроде этого:

<Window.Resources>
    <local:BindingClass x:Key="bindingClass"/>
</Window.Resources>
<Grid DataContext="{StaticResource bindingClass.MyPerson}">
    <Label Content="{Binding Surname}"/>
</Grid>

Для этого необходимо создать отдельный класс (в данном случае называемый BindingClass), который содержит свойство MyPerson.

Я думаю, что это работает в конструкторе, потому что я явно создаю новый экземпляр класса в xaml.

0 голосов
/ 28 мая 2010

Еще один простой способ справиться с этой первой привязкой - дать вашему окну имя и ссылаться на него с помощью ElementName в привязке:

<Window x:Class="WpfApplication1.Window1"
    Name="MyWindow"
    ...>
<StackPanel>
    <Label>My Person</Label>
    <WrapPanel>
        <Label>First Name:</Label>
        <Label Content="{Binding Path=MyPerson.FirstName, ElementName=MyWindow}"></Label>
    </WrapPanel>
    <WrapPanel>
        <Label>Last Name:</Label>
        <Label Content="{Binding MyPerson.Surname}"></Label>
    </WrapPanel>
</StackPanel>
...