使用DependencyProperty访问UserControl代码中的绑定对象

时间:2011-03-31 19:20:49

标签: c# wpf data-binding dependency-properties

我无法通过父UserControl上的数据绑定使用DependencyProperty设置自定义用户控件的属性。

以下是我的自定义UserControl的代码:

public partial class UserEntityControl : UserControl
{
    public static readonly DependencyProperty EntityProperty =  DependencyProperty.Register("Entity",
        typeof(Entity), typeof(UserEntityControl));

    public Entity Entity
    {
        get
        {
            return (Entity)GetValue(EntityProperty);
        }
        set
        {
            SetValue(EntityProperty, value);
        }
    }

    public UserEntityControl()
    {
        InitializeComponent();
        PopulateWithEntities(this.Entity);
    }
}

我希望在后面的代码中访问Entity属性,因为它将根据存储在Entity中的值动态构建用户控件。我遇到的问题是从未设置Entity属性。

以下是我在父用户控件中设置绑定的方法:

<ListBox Grid.Row="1" Grid.ColumnSpan="2" ItemsSource="{Binding SearchResults}"     x:Name="SearchResults_List">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <!--<views:SearchResult></views:SearchResult>-->
            <eb:UserEntityControl  Entity="{Binding}" ></eb:UserEntityControl>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我将ListBox的ItemsSource设置为SearchResults,它是一个Observable实体集合(与自定义UserControl上的Entity类型相同)。

我没有在调试输出窗口中收到任何运行时绑定错误。我只是无法设置Entity属性的值。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您正试图在c-tor中使用Entity属性,这太快了。在将要给出属性值之前,将对c-tor进行解雇。

你需要做的是将一个propertyChanged事件HAndler添加到DependencyProperty,如下所示:

    public static readonly DependencyProperty EntityProperty = DependencyProperty.Register("Entity",
typeof(Entity), typeof(UserEntityControl), new PropertyMetadata(null, EntityPropertyChanged));

    static void EntityPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var myCustomControl = d as UserEntityControl;

        var entity = myCustomControl.Entity; // etc...
    }

    public Entity Entity
    {
        get
        {
            return (Entity)GetValue(EntityProperty);
        }
        set
        {
            SetValue(EntityProperty, value);
        }
    }