2010-05-28 63 views
3

只是学习WPF数据绑定,并在我的理解有差距。我在StackOverflow上看到过一些类似的问题,但我仍然在努力确定我做错了什么。WPF DataBinding在代码隐藏中的标准CLR属性

我有一个简单的人类与名字和姓氏属性(标准CLR属性)。我的Window类中也有一个标准的CLR属性,用于公开一个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> 

我仍然无法得到它的工作虽然!

+1

尝试添加此命名空间的xmlns:诊断=” CLR的命名空间:System.Diagnostics程序;装配= WindowsBase” 并添加绑定诊断:PresentationTraceSources.TraceLevel =高看绑定错误是什么。你的绑定应该看起来像Content =“{Binding Surname,diag:PresentationTraceSources.TraceLevel = High}” – 2010-05-28 12:23:43

+0

每当你有一个数据绑定错误 - 不,每当你调试任何使用数据绑定的WPF应用程序时,有VS的输出窗口打开并在屏幕上可见,这样你就可以看到绑定写入它的许多错误消息,当它不工作时。 – 2010-05-28 18:53:57

+1

此问题的标题应该正确,以读取“WPF DataBinding to * XAML *中的标准CLR属性”。在代码隐藏中绑定是一个完全不同的问题。 – kpozin 2010-10-06 21:11:29

回答

2

好吧,我在这里发现了这个问题。 WPF是新手,所以花了我一段时间才弄明白。

在后面的代码中,我在设置MyPerson属性之后,调用了InitializeComponent的

我使用的第一种方法是因为Window初始化并且MyPerson属性由标签初始化时设置的,并且它的数据绑定表达式被评估。

第二种方法不起作用,因为MyPerson属性在Window和关联的DataContext初始化时尚未设置。

简单,当你知道如何!

1

对于第二种方法的工作,你只需要

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

,因为你已经在顶部的窗口元素设置的DataContext的人。

顶级datacontext适用于我,但绑定不会显示在设计器中,除非我有一个单独的类包含数据。对于这个工作,你会那么做这样的事情:

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

这需要你创建一个包含MyPerson属性一个单独的类(在这种情况下,所谓的BindingClass)。

我认为这在设计器中有效,因为我在xaml中明确创建了该类的新实例。

+0

啊,谢谢我看到了。我认为这只是一个错误,从我改变事情的时候开始,试图让它发挥作用。如果我删除了MyPerson限定符,它仍然不起作用。 – nukefusion 2010-05-28 11:42:38

+0

{Binding Path =姓氏} – 2010-05-28 11:47:12

+0

试了一下。我认为问题在于我声明DataContext的方式。只是不知道什么.... – nukefusion 2010-05-28 11:57:20

1

首先,除非您在该绑定上设置诊断,否则大多数情况下不会看到绑定错误。第二个不起作用的原因是您已将DataContext设置为MyPerson。既然这是DataContext,你需要做的就是绑定到属性Surname。你现在的方式是试图调用MyPerson.MyPerson.Surname。

0

另一种简单的方法来处理,首先结合将是给你的窗口的名称,并在具有约束力的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>