Проблема связывания WPF - PullRequest
0 голосов
/ 18 июня 2010

У меня проблема с привязкой в ​​XAML / WPF. Я создал класс Action, который расширяет FrameworkElement. Каждое действие имеет список ActionItem. Проблема в том, что свойства Data / DataContext в ActionItem не установлены, поэтому они всегда равны нулю.

XAML:

<my:Action DataContext="{Binding}">
    <my:Action.Items>
        <my:ActionItem DataContext="{Binding}" Data="{Binding}" />
    </my:Action.Items>
</my:Action>

C #:

public class Action : FrameworkElement
{
    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register("Items", typeof(IList), typeof(Action), 
                                    new PropertyMetadata(null, null), null);

    public Action()
    {
        this.Items = new ArrayList();
        this.DataContextChanged += (s, e) => MessageBox.Show("Action.DataContext");
    }

    public IList Items
    {
        get { return (IList)this.GetValue(ItemsProperty); }
        set { this.SetValue(ItemsProperty, value); }
    }
}

public class ActionItem : FrameworkElement
{
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(ActionItem),
            new PropertyMetadata(
                null, null, (d, v) =>
                {
                    if (v != null)
                        MessageBox.Show("ActionItem.Data is not null");
                    return v;
                }
            ), null
        );

    public object Data
    {
        get { return this.GetValue(DataProperty); }
        set { this.SetValue(DataProperty, value); }
    }

    public ActionItem()
    {
        this.DataContextChanged += (s, e) => MessageBox.Show("ActionItem.DataContext");
    }
}

Есть идеи?

1 Ответ

3 голосов
/ 18 июня 2010

Элементы не являются дочерними элементами элемента управления Action, поэтому DataContext не распространяется на его.Вы можете сделать несколько вещей, чтобы исправить это.

Самый простой способ - переопределить метод Action.OnPropertyChanged, и если Property == e.DataContextProperty, тогда назначьте e.NewValue для каждого элемента действия.Это самое простое, но не очень хорошее решение, потому что если вы добавите новое действие в список элементов, оно не получит текущий контекст данных.

Второй способ - это наследование Action от ItemsControl и предоставление для него настраиваемого шаблона элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...