集合为的wpf附加属性未更新



我喜欢在应用程序和自定义用户控件之间共享列表。我使用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>

放置在主机内部的Usercontrol通过附加的属性接收集合。装订看起来很重,但似乎还可以:

<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放入附加的属性中?如果是,在哪里以及如何?

这是我的解决方案:

1) 用户控件的dp:

public static readonly DependencyProperty SelectionListProperty = DependencyProperty.Register(
        "SelectionList",
        typeof(ObservableCollection<MyList>),
        typeof(MyUserControl),
        new UIPropertyMetadata(null));

(..添加属性获取/设置包装器)

2) 在列表上设置UserControls项目源,例如

_combobox.ItemsSource = SelectionList;

3) 主机拥有该列表。在实例化用户控件的类中添加数据及其属性。在我的情况下,我使用只读/单向绑定。

ObservableCollection<MyList> _bigList= new ObservableCollection<MyList>();
public ObservableCollection<MyList> BigList
    {
        get { return _bigList; }
    }

4) xaml 中的集合结合

<myctrl:MyUserControl
    SelectionList="{Binding BigList, Mode=OneWay}"
     ...
 />

5) 现在,每当您修改_biglist时,请在"biglist"上调用PropertyChangedEventHandler。这将通知UserControl的SelectionList由绑定设置,并调用BigList get{}。希望你清楚。

相关内容

  • 没有找到相关文章

最新更新