【问题标题】:Binding to custom Dependency Property fails绑定到自定义依赖属性失败
【发布时间】:2013-06-20 22:57:40
【问题描述】:

由于 ListBox 控件的 SelectedItems property 是普通属性,不是要绑定的依赖属性,因此我从 ListBox 派生并创建了一个新的依赖属性 SelectedItemsEx。 p>

但是我的 XAML 编译器一直给我错误

不能在 'SelectedItemsEx' 属性上设置“绑定” 键入“我的列表框”。只能在 DependencyProperty 上设置“绑定” 一个 DependencyObject。

为什么我的属性未被识别为依赖属性?感谢您的帮助,谢谢!

XAML:

  <MyListBox ItemsSource="{Binding MyData}" SelectedItemsEx="{Binding SelectedEx}" 
                                            SelectionMode="Extended"> ... </MyListBox>

ListBox 的实现:

public class MyListBox : ListBox
{
    public readonly DependencyProperty SelectedItemsExProperty =
            DependencyProperty.Register("SelectedItemsEx", 
                typeof(ObservableCollection<MyItemsDataType>), 
                typeof(MyListBox), 
                new PropertyMetadata(default(ObservableCollection<MyItemsDataType>)));


    public ObservableCollection<MyItemsDataType> SelectedItemsEx
    {
        get
        {
            var v = GetValue(SelectedItemsExProperty);
            return (ObservableCollection<MyItemsDataType>)v;
        }
        set { SetValue(SelectedItemsExProperty, value); }
    }

    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        base.OnSelectionChanged(e);
        if (SelectedItemsEx != null)
        {
            SelectedItemsEx.Clear();
            foreach (var item in base.SelectedItems)
            {
                SelectedItemsEx.Add((MyItemsDataType)item);
            }
        }
    }

【问题讨论】:

    标签: c# wpf binding dependency-properties


    【解决方案1】:

    DependencyProperty 字段必须是静态的:

    public static readonly DependencyProperty SelectedItemsExProperty = ...
    

    还要注意,为了使您的派生 ListBox 更易于重用,您不应限制 SelectedItemsEx 属性的类型。请改用IEnumerable(或IList,如SelectedItems)。此外,不需要通过属性元数据指定默认值,因为它已经是null,而default(&lt;any reference type&gt;) 也是null

    但是,只要 SelectedItemsEx 属性发生更改,您就必须收到通知。因此,您必须通过属性元数据注册更改回调:

    public static readonly DependencyProperty SelectedItemsExProperty =
        DependencyProperty.Register(
            "SelectedItemsEx", typeof(IEnumerable), typeof(MyListBox),
            new PropertyMetadata(SelectedItemsExPropertyChanged));
    
    public IEnumerable SelectedItemsEx
    {
        get { return (IEnumerable)GetValue(SelectedItemsExProperty); }
        set { SetValue(SelectedItemsExProperty, value); }
    }
    
    private static void SelectedItemsExPropertyChanged(
        DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var listBox = (MyListBox)obj;
        var oldColl = e.OldValue as INotifyCollectionChanged;
        var newColl = e.NewValue as INotifyCollectionChanged;
    
        if (oldColl != null)
        {
            oldColl.CollectionChanged -= listBox.SelectedItemsExCollectionChanged;
        }
    
        if (newColl != null)
        {
            newColl.CollectionChanged += listBox.SelectedItemsExCollectionChanged;
        }
    }
    
    private void SelectedItemsExCollectionChanged(
        object sender, NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 2012-08-29
      • 2011-12-20
      • 2012-12-07
      • 2019-05-26
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多