我喜欢在应用程序和自定义用户控件之间共享一个列表。我使用 IEnumerable 作为附加属性来为自定义 UserControl 内的 Listbox 提供一个列表。ListBox 然后接收附加的属性作为 ItemsSource。到目前为止,这有效。但是当主机列表更改时,用户控件内的列表应该会更新。我怎样才能做到这一点?当前代码设置了 Usercontrol 列表,但是当宿主更改列表时,附加属性不会得到更新。
使用 UserControl 的主机有一个 ComboBox,它应该与 UserControl 的 ListBox 共享它的 ItemsSource
public ObservableCollection<Person> PersonList
{
get;
set;
}
宿主的 Xaml 将 ComboBox 绑定到集合:
<ComboBox x:Name="combobox1" Width="200" ItemsSource="{Binding PersonList}" DisplayMemberPath="Name" SelectedIndex="0" IsEditable="True"></ComboBox>
放置在主机内部的用户控件通过附加属性接收集合。绑定看起来很重,但似乎还可以:
<myUserCtrl:AdvEditBox
...
prop:DynamicListProvider.DynamicList="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=DataContext.PersonList}">
...
</myUserCtrl:AdvEditBox
附加属性有一个回调,目前只调用一次:
class DynamicListProvider : DependencyObject
{
public static readonly DependencyProperty DynamicListProperty = DependencyProperty.RegisterAttached(
"DynamicList",
typeof(IEnumerable),
typeof(DynamicListProvider),
new FrameworkPropertyMetadata(null, OnDynamicListPropertyChanged)));
public static IEnumerable GetDynamicList(UIElement target) {..}
public static void SetDynamicList(UIElement target, IEnumerable value) {..}
private static void OnDynamicListPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && o is FrameworkElement)
{
...
}
}
每当主机的 PersonList 更改时,都应调用 OnDynamicListPropertyChanged()。我是否必须将 INotifyCollectionChanged 放在附加属性中?如果是这样,在哪里以及如何?