Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# RaisePropertyChanged不适用于集合_C#_Windows Phone 7_Binding_Mvvm Light - Fatal编程技术网

C# RaisePropertyChanged不适用于集合

C# RaisePropertyChanged不适用于集合,c#,windows-phone-7,binding,mvvm-light,C#,Windows Phone 7,Binding,Mvvm Light,我正在使用mvvm light,我注意到RaisePropertyChanged的这种奇怪行为 xaml: 虚拟机: 因此,RaisePropertyChangedCollection不会更新绑定,而RaisePropertyChangedText会更新绑定。我可以通过多次执行Command2和Command1来查看它。如果集合是ObservableCollection,则视图中会显示新元素,但更新的项不显示,这意味着ObservableCollection的内部机制可以工作,但RaisePro

我正在使用mvvm light,我注意到RaisePropertyChanged的这种奇怪行为

xaml:

虚拟机:


因此,RaisePropertyChangedCollection不会更新绑定,而RaisePropertyChangedText会更新绑定。我可以通过多次执行Command2和Command1来查看它。如果集合是ObservableCollection,则视图中会显示新元素,但更新的项不显示,这意味着ObservableCollection的内部机制可以工作,但RaiseProperty没有更改。

首先,对问题的解释:

在Windows Phone上,当设置依赖项属性的值时,框架会在内部检查新值是否与旧值不同,以便进行优化。当引发PropertyChanged事件或直接将集合重新分配给ItemsSource属性(该属性只是ItemsControl.ItemsSourceProperty依赖项属性的包装器)时,框架会检测到该值实际上没有更改,也不会更新该属性。因此,列表框不会被通知您的更改,也不会被更新

ObservableCollection之所以有效,是因为它使用了一种完全不同的机制:ListBox直接订阅集合的CollectionChanged事件,因此不受依赖项属性限制的影响

现在,如何绕过这个限制?我能想到的唯一解决办法是:

使用ObservableCollection而不是列表 将null分配给ListBox的ItemsSource属性,然后重新分配集合 将ListBox绑定到一个属性,该属性将在每次调用它时返回不同的集合:

public List<A> CollectionCopy
{
    get
    {
        return this.Collection.ToList();
    }
}

首先,对问题的解释:

在Windows Phone上,当设置依赖项属性的值时,框架会在内部检查新值是否与旧值不同,以便进行优化。当引发PropertyChanged事件或直接将集合重新分配给ItemsSource属性(该属性只是ItemsControl.ItemsSourceProperty依赖项属性的包装器)时,框架会检测到该值实际上没有更改,也不会更新该属性。因此,列表框不会被通知您的更改,也不会被更新

ObservableCollection之所以有效,是因为它使用了一种完全不同的机制:ListBox直接订阅集合的CollectionChanged事件,因此不受依赖项属性限制的影响

现在,如何绕过这个限制?我能想到的唯一解决办法是:

使用ObservableCollection而不是列表 将null分配给ListBox的ItemsSource属性,然后重新分配集合 将ListBox绑定到一个属性,该属性将在每次调用它时返回不同的集合:

public List<A> CollectionCopy
{
    get
    {
        return this.Collection.ToList();
    }
}

您是否为类A实现了INPC?@RV1987,ObserveObject实现。只要您设置的属性正在引发PropertyChanged事件,UI就会得到更新。@RV1987,事实上它不会。此外,集合的ItemsSource的GetBindingExpression….UpdateSource也不更新UI,但var dc=this.DataContext;this.DataContext=null;this.DataContext=dc;正确更新。我用类A实现的INPC尝试了您的示例,但它对我有效。您为类A实现了INPC吗?@RV1987,ObserveObject实现。只要您设置的属性引发PropertyChanged事件,UI就会得到更新。@RV1987,事实是它没有。此外,集合的ItemsSource的GetBindingExpression….UpdateSource也不更新UI,但var dc=this.DataContext;this.DataContext=null;this.DataContext=dc;正确地更新了它。我用类A实现的INPC尝试了你的示例,但它对我有效。
public MainViewModel(IDataService dataService) { this.Collection = new List<A>(...); }

public RelayCommand Command1
{
    get
    {
        return this._command1 ?? (this._command1= new RelayCommand(() =>
        {
            this.Collection.Add(new A());
            this.Collection[2].B = "updated";
            this.RaisePropertyChanged("Collection");
            this.RaisePropertyChanged("Text");
        }));
    }
}

public RelayCommand Command2
{
    get { return this._command2?? (this._command2 = new RelayCommand(() => { this.Text++; })); }
}

public List<A> Collection { get; set; }
public int Text { get; set; }
public List<A> CollectionCopy
{
    get
    {
        return this.Collection.ToList();
    }
}