Доступ к связанному объекту в коде UserControl с помощью DependencyProperty - PullRequest
2 голосов
/ 31 марта 2011

У меня проблемы с установкой свойства пользовательского элемента управления с помощью DependencyProperty через привязку данных в родительском UserControl.

Вот код для моего пользовательского элемента управления 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>

Я устанавливаю для ItemsSource объекта ListBox значение SearchResults, которое является наблюдаемой коллекцией сущностей (того же типа, что и сущность в пользовательском элементе управления UserControl).

Я не получаю никаких ошибок привязки во время выполнения в окне вывода отладки. Я просто не могу установить значение свойства Entity. Есть идеи?

1 Ответ

3 голосов
/ 31 марта 2011

Вы пытаетесь использовать свойство Entity в c-tor, что слишком рано.c-tor будет запущен ДО того, как будет дано значение свойства.

Что вам нужно сделать, это добавить propertyChanged Event 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);
        }
    }
...