DependencyProperty数据绑定返回空值

时间:2013-01-23 02:34:24

标签: xaml windows-8 dependency-properties

我正在编写一个Windows 8商店应用程序(Metro / Modern?),我正在创建一个控件来重复使用多个表单上的格式。我以前创建了一些WPF应用程序,并尝试以与在WPF中相同的方式创建依赖项属性。当我将控件放在表单上使用它时,我无法获得任何返回值。

我的personControl.cs WPF类:
  public partial class PersonControl:UserControl       {

    public PersonControl()
    {
        InitializeComponent();

    }

    public static readonly DependencyProperty PersonProperty = 
        DependencyProperty.Register("thisPerson", typeof(Person), typeof(PersonControl));

    public Person thisPerson
    {
        get
        {
            return (Person)GetValue(PersonProperty);
        }
        set
        {
            SetValue(PersonProperty, value);
        }
    }

}

对于Windows 8应用程序,它需要添加PropertyMetadata - 我假设这是我出错的地方,但我无法找到要做的事情:

public partial class PersonControl:UserControl       {

    public PersonControl()
    {
        InitializeComponent();

    }

    public static readonly DependencyProperty PersonProperty = 
        DependencyProperty.Register("thisPerson", typeof(Person), typeof(PersonControl), new PropertyMetadata(new Person()));

    public Person thisPerson
    {
        get
        {
            return (Person)GetValue(PersonProperty);
        }
        set
        {
            SetValue(PersonProperty, value);
        }
    }

}

我所知道的XAML中控件的使用或绑定没有任何改变。我仍在使用示例数据,因此我创建了一个List(Person),然后创建一个列表框并将列表框绑定到List(Person)。


这是绑定代码:

在usercontrol xaml:

<Grid x:Name=”PersonGrid”>
…….
<TextBox x:Name="txtFirstName" Text="{Binding Path=thisPerson.FirstName, ElementName=This}"></TextBox>

在主页Xaml:

<StackPanel x:Name="layoutRoot">        
   <ListBox x:Name="myListbox">
       <ListBox.ItemTemplate>
           <DataTemplate>
                <local:PersonControl x:Name="myControl" thisPerson="{Binding Path=.}" Margin="5"></local:PersonControl>               
           </DataTemplate>
       </ListBox.ItemTemplate>
   </ListBox>

背后的主页代码:

List<Person> People = new List<Person>();
… populate data … 
myListbox.ItemsSource = People;

作为附加说明 - 当我获取UserControlXaml的内容并将UI元素直接放入主页面上的XAML时,它工作正常 - 当我使用UserControl它失败时。

2 个答案:

答案 0 :(得分:1)

IIRC,如果该值不同于默认值,则SetProperty调用仅导致更改被注册。同样,IIRC,SetProperty不会比较实际对象,只是已经设置了对象的引用(object.Equals vs. object!= null)。使用此代码...

new PropertyMetadata(new Person()));

SetValue无法正常工作,因为它有一个对象,并且分配一个新对象不会导致属性更新。改为

new PropertyMetadata(null)

我认为事情会正常运作。

有点匆忙,也许我错过了一些东西......

答案 1 :(得分:0)

似乎是用户控件上的XAML中的行:

<TextBox x:Name="txtFirstName" Text="{Binding Path=thisPerson.FirstName, ElementName=This}">

在Windows 8中的工作方式不同 - 当我拿出对ElementName和DependencyProperty的引用时(并且让.Net想出来就是我自己的猜测吗?)它运行正常。

这样:

 <TextBox x:Name="txtFirstName" Text="{Binding Path=FirstName}"></TextBox>

工作正常,Binding现在正常运行。