Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖属性更新机制_C#_Wpf_Dependency Properties - Fatal编程技术网

C# 依赖属性更新机制

C# 依赖属性更新机制,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我有一个自定义控件,其中定义了依赖项属性,并且我的控件实现了INotifyPropertyChanged接口 Dependency属性是自定义对象的集合 情景1 DP属于列表类型,无论我在列表中做了什么更改,MainUI中都没有更新,因为我相信WPF不理解在列表中添加和删除对象。它理解全新的引用,所以每当我想更新我使用的控件列表时,就可以实现这一点 MyProperty=新列表() 在这种方法中,我的DP回调每次都会触发,但eventArgs.NewValue始终保持为零(它正确地更新了UI上的

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

Dependency属性是自定义对象的集合

情景1

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

MyProperty=新列表()

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

情景2

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


我应该如何使其中任何一个或两个都工作。

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


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


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

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

XAML:


代码隐藏:

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" };
    }
}
公共部分类窗口1:窗口
{
公共ObservableCollection字符串{get;set;}
公共列表字符串列表
{
获取{return(List)GetValue(StringsListProperty);}
set{SetValue(StringsListProperty,value);}
}
公共静态只读从属属性StringsListProperty=
DependencyProperty.Register(“StringsList”、typeof(列表)、typeof(窗口)、new PropertyMetadata(null、StringsListPropertyChanged));
公共窗口1()
{
初始化组件();
字符串=新的ObservableCollection();
Strings.CollectionChanged+=Strings\u CollectionChanged;
StringsList=新列表{“Test1”、“Test2”、“Test3”、“Test4”};
}
无效字符串\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//每次observablecollection添加/删除项目等时激发。
Show(string.Format(“ObservableCollection已更改!计数现在为{0}”),this.Strings.Count.ToString());
if(this.Strings.Count==10)
WriteLine(“集合包含10个字符串!!”;
}
私有静态void StringsListPropertyChanged(DependencyObject e,DependencyPropertyChangedEventArgs参数)
{
var newCount=((列表)args.NewValue.Count.ToString();
Show(string.Format(“依赖项属性已更改!计数现在为{0}”,newCount));
}
私有无效点击1(对象发送者,路由目标)
{
this.Strings.Add(“Test1”);
}
私有无效点击2(对象发送者,路由目标)
{
this.StringsList=新列表{“Newitem1”、“Newitem2”};
}
}

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

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

XAML:


代码隐藏:

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" };
    }
}
公共部分类窗口1:窗口
{
公共ObservableCollection字符串{get;set;}
公共列表字符串列表
{
获取{return(List)GetValue(StringsListProperty);}
set{SetValue(StringsListProperty,value);}
}
公共静态只读从属属性StringsListProperty=
DependencyProperty.Register(“StringsList”、typeof(列表)、typeof(窗口)、new PropertyMetadata(null、StringsListPropertyChanged));
公共窗口1()
{
初始化组件();
字符串=新的ObservableCollection();
Strings.CollectionChanged+=Strings\u CollectionChanged;
StringsList=新列表{“Test1”、“Test2”、“Test3”、“Test4”};
}
无效字符串\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
//每次observablecollection添加/删除项目等时激发。
Show(string.Format(“ObservableCollection已更改!计数现在为{0}”),this.Strings.Count.ToString());
if(this.Strings.Count==10)
WriteLine(“集合包含10个字符串!!”;
}
私有静态void StringsListPropertyChanged(DependencyObject e,DependencyPropertyChangedEventArgs参数)
{
var newCount=((列表)args.NewValue.Count.ToString();
Show(string.Format(“依赖项属性已更改!计数现在为{0}”,newCount));
}
私有无效点击1(对象发送者,路由目标)
{
这个,字符串