[英]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.