1

我有一个自定义控件,其中定义了一个依赖属性,并且我的控件实现了 INotifyPropertyChanged 接口。

依赖属性是自定义对象的集合。

方案 1

DP 属于 List 类型,无论我在列表中进行什么更改,MainUI 中都没有更新,因为我相信 WPF 不理解在列表中添加和删除对象。它了解全新的参考资料,以便实现这一点,每当我想更新我使用的控件列表时

我的属性=新列表();

在这种方法中,我的 DP 回调每次都会触发,但 eventArgs.NewValue 始终保持为零(它正确更新了 UI 上的列表)但是因为我需要在基于 e.NewItems.Count 的属性更改回调中编写一些逻辑,在这种情况下没有不行。请告诉我为什么 e.NewItems 不起作用。

方案 2

DP 属于 ObservableCollection 类型,因此作为我绑定 DP 的视图模型中的集合属性。在这种情况下,我的属性更改回调根本不会触发,因为在第一次初始化属性后我再也没有使用“new”关键字。UI 更新但属性更改仍未触发。所以我在属性更改回调中的逻辑不会被执行。

我应该如何使它们中的任何一个或两个都起作用。

4

2 回答 2

1

我会使用 ObservableCollection 方法,并订阅它的CollectionChanged事件。
这样,每当集合发生更改时,您都会收到通知。

但另一种方法也应该有效。当您将常规列表设置为新实例时,PropertyChangedCallback将为依赖属性触发 ,并且通过检查DependencyPropertyChangedEventArgs对象可以获得新值。

XAML:

<StackPanel>
    <Button Content="Add to observablecollection" Click="click1" />
    <Button Content="Set list to new instance" Click="click2" />
</StackPanel>

代码隐藏:

public partial class Window1 : Window
{
    public ObservableCollection<string> Strings { get; set; }

    public List<string> StringsList
    {
        get { return (List<string>)GetValue(StringsListProperty); }
        set { SetValue(StringsListProperty, value); }
    }

    public static readonly DependencyProperty StringsListProperty =
        DependencyProperty.Register("StringsList", typeof(List<string>), typeof(Window), new PropertyMetadata(null, StringsListPropertyChanged));

    public Window1()
    {
        InitializeComponent();

        Strings = new ObservableCollection<string>();
        Strings.CollectionChanged += strings_CollectionChanged;

        StringsList = new List<string> { "Test1", "Test2", "Test3", "Test4" };
    }

    void strings_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        //Fires everytime the observablecollection has an item added/removed etc.
        MessageBox.Show(string.Format("ObservableCollection has changed! Count is now {0}", this.Strings.Count.ToString()));

        if (this.Strings.Count == 10)
            Console.WriteLine("Collection contains 10 strings!!");
    }

    private static void StringsListPropertyChanged(DependencyObject e, DependencyPropertyChangedEventArgs args)
    {
        var newCount = ((List<string>)args.NewValue).Count.ToString();
        MessageBox.Show(string.Format("Dependency property has changed! Count is now {0}", newCount));
    }

    private void click1(object sender, RoutedEventArgs e)
    {
        this.Strings.Add("Test1");
    }

    private void click2(object sender, RoutedEventArgs e)
    {
        this.StringsList = new List<string> { "Newitem1", "Newitem2" };
    }
}
于 2012-11-27T19:28:00.180 回答
0

ObservableCollection 继承自 INotifyPropertyChanged 和 INotifyCollectionChanged。我认为如果您想知道集合何时更改,您应该使用此接口:

INotifyCollectionChanged

于 2012-11-27T19:26:23.273 回答