string 和List 的不同绑定行为

当源对象是string[]List时,我试图理解(没有成功)为什么绑定在行为上有差异。 我有两个列表,它们唯一的区别是ItemsSource – 在第二个List中的一个case 数组中:

XAML代码:

  

代码背后:

 public sealed partial class MainPage : Page, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); public string[] ArrayElements { get; } = new string[] { "Standard", "Standard", "Standard" }; public List ListElements { get; } = new List { "Standard", "Standard", "Standard" }; public MainPage() { this.InitializeComponent(); this.DataContext = this; } private void Button_Click(object sender, RoutedEventArgs e) { ArrayElements[1] = "Modified one"; ListElements[1] = "Modified one"; RaiseProperty(nameof(ArrayElements)); RaiseProperty(nameof(ListElements)); } } 

一旦我点击按钮,第一个列表(在数组上构建)将重新填充新元素(看起来像新的ItemsSource ),所以我可以看到一点闪烁和第二个元素的变化。

同一时间在第二个列表中没有任何变化 – 对绑定源的引用不会改变,所以我们没有看到屏幕上的差异( PropertyChange没有效果,因为没有属性被更改) – 这很清楚。

那么为什么ItemsSource设置为数组的列表行为有所不同?

重现问题的示例 (尽管几乎整个代码都在上面)

这对我来说听起来很奇怪,但我从未遇到过这个问题,因为我在一个可观察的集合中使用了ElementViewModel对象。 而不是更改list-item / Array元素i更改ElementViewModel的属性并在那里使用INotifyProperty Change。 这不是你问题的真正答案,但你可以解决这个问题。