WPF绑定问题

时间:2010-06-18 10:27:09

标签: c# wpf xaml binding

我在XAML / WPF中遇到绑定问题。 我创建了Action类,它扩展了FrameworkElement。每个Action都有ActionItem列表。问题是ActionItem的Data / DataContext属性未设置,因此它们始终为null。

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 个答案:

答案 0 :(得分:3)

项目不是Action控件的子项,因此DataContext不会传播到它。您可以做一些事情来解决它。

最简单的方法是覆盖Action.OnPropertyChanged方法,如果Property == e.DataContextProperty,则将e.NewValue分配给每个操作项。这是最简单但不是很好的解决方案,因为如果向项目列表添加新操作,它将无法获取当前数据上下文。

第二种方法是从ItemsControl继承Action,并为它提供自定义控件模板。