C# INotifyPropertyChanged won&x27;如果只有属性';元素改变了
我正在使用一个通用列表作为我的属性。我正在调用C# INotifyPropertyChanged won&x27;如果只有属性';元素改变了,c#,C#,我正在使用一个通用列表作为我的属性。我正在调用INotifyPropertyChange将此属性更新到UI,但除非整个列表已更改,否则它将无法工作 正在工作的代码: public class ClassA : INotifyPropertyChange { public event PropertyChangedEventHandler PropertyChanged; private void OnNotifyPropertyChanged( string p) {
INotifyPropertyChange
将此属性更新到UI,但除非整个列表已更改,否则它将无法工作
正在工作的代码:
public class ClassA : INotifyPropertyChange
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnNotifyPropertyChanged( string p)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
public List<ClassB> listA
{
get
{
return new list<ClassB>()
{
new ClassB(property1, property2),
};
}
}
我将在Update()函数中每秒调用NotifyPropertyChanged(“ListA”)
InXAML
<ListBox Style="{StaticResource ListBoxListAStyle}" Grid.Row="2" ItemsSource="{Binding ListA }" />
如前所述,第一个可以正常工作,但当我更改ListB
并将ListB
返回到ListA
时,它将不再更新UI。PS:我在其他地方调用了NotifyPropertyChanged(string ListA),我认为这应该没有问题
编辑:
在第二种情况下,当我调用NotifyPropertyChanged(string ListA)时,我不知道如何检查我的PropertyChanged
是否已被激发。但它不会更新用户界面。我试着用ObservableCollection
代替List
,但似乎把List改成ObservableCollection并不是那么简单?我注意到一件奇怪的事情,在对应XAML的列表框中,即使程序暂停并出现断点,ListA的ItemsSource也在更改。我可以在打开/关闭XAML文件时看到它正在更改,但它不会为我更新UI
更新:
看起来,在本例中,一旦您实现了ClassB的
INotifyPropertyChange
接口,它就会开始工作。希望这对您有所帮助。对于集合,您需要3种更改通知:
你试过这个问题的答案了吗?它在第一次调用OnNotifyPropertyChanged(ListA)时被激发,但当我编辑ListB时,它不会在下次调用OnNotifyPropertyChangedUsing WPF时被激发,这实际上是不完整的。ListView和其他组件确实将自己注册到OnCollectionChangedEvent of ObservableCollections,但是它们没有内置的机制来处理整个集合的替换。因此,如果在源属性中更改集合,请确保修复绑定。(最近没有测试过,如果行为改变了,请让我知道…@SANIM:我很少在WPF中使用列表视图。通常我会把它绑定到任何一个奇怪的容器上,然后让数据模板把我带到那里。那些预写的显示元素对我来说太有限了。不过OP可能正在使用那些预写的显示元素,没有提到其他库。顺便说一句,关于上述行为的更多信息。@SANIM:当我只编辑我收藏的项目时,它不会更新,他提到的可观察收藏在这种情况下有帮助吗?顺便说一句,我确实使用ListView。@Cactus:我需要更多信息来确定原因。请提供代码,说明如何绑定到ListView中的属性、类型以及声明位置。如果希望对集合进行数据绑定,ObservableCollection通常是一种方法。然而,除此之外,可能还有更多的问题。
public class ClassB
{
public string Property1 {get;set;}
public string Property2 {get;set;}
}
<ListBox Style="{StaticResource ListBoxListAStyle}" Grid.Row="2" ItemsSource="{Binding ListA }" />