簡體   English   中英

綁定到自定義依賴項屬性失敗

[英]Binding to custom Dependency Property fails

由於ListBox控件的SelectedItems property是常規屬性,而不是要綁定的依賴項屬性,因此我派生了ListBox並創建了新的依賴項屬性SelectedItemsEx

但是我的XAML編譯器不斷給我錯誤

無法在“ MyListBox”類型的“ SelectedItemsEx”屬性上設置“綁定”。 只能在DependencyObject的DependencyProperty上設置“綁定”。

為什么我的財產不被視為依賴財產? 任何幫助表示贊賞,謝謝!

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);
            }
        }
    }

DependencyProperty字段必須為靜態:

public static readonly DependencyProperty SelectedItemsExProperty = ...

還要注意,為了使派生的ListBox更具可重用性,您不應限制SelectedItemsEx屬性的類型。 請改用IEnumerable (或IList類的SelectedItems )。 此外,無需通過屬性元數據指定默認值,因為它已經為null並且default(<any reference type>)也為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)
    {
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM