Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.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# INotifyPropertyChanged won&x27;如果只有属性';元素改变了_C# - Fatal编程技术网

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种更改通知:

  • ClassA的每个属性的更改通知
  • 您收到的集合[ClassA]上的更改通知,因此任何添加和删除都会进行通信。一次可观察的收集可以帮你解决问题
  • 公开了ObservableCollection[ClassA]上属性的更改通知。适用于需要重新组装整个集合的情况。您将不得不处理ObservableCollection(在暴露时进行批量更改非常糟糕)

  • 你试过这个问题的答案了吗?它在第一次调用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 }" />