C# 字符串[]和列表的不同绑定行为<;字符串>;

C# 字符串[]和列表的不同绑定行为<;字符串>;,c#,xaml,binding,windows-10,uwp,C#,Xaml,Binding,Windows 10,Uwp,我试图理解(但没有成功)为什么当源对象是string[]和List时绑定的行为会有所不同。我有两个列表,它们唯一的区别是ItemsSource-在第二个列表中的一个案例数组中: XAML代码: 代码隐藏: 公共密封部分类主页面:第页,INotifyPropertyChanged { 公共事件属性更改事件处理程序属性更改; public void RaiseProperty(字符串名称)=>PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs

我试图理解(但没有成功)为什么当源对象是
string[]
List
时绑定的行为会有所不同。我有两个列表,它们唯一的区别是ItemsSource-在第二个列表中的一个案例数组中:

XAML代码:


代码隐藏:

公共密封部分类主页面:第页,INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
public void RaiseProperty(字符串名称)=>PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称));
公共字符串[]数组元素{get;}=新字符串[]{“标准”、“标准”、“标准”};
公共列表列表元素{get;}=新列表{“标准”、“标准”、“标准”};
公共主页(){this.InitializeComponent();this.DataContext=this;}
私有无效按钮\u单击(对象发送者,路由目标e)
{
ArrayElements[1]=“修改过的一个”;
列表元素[1]=“修改过的一个”;
RaiseProperty(阵列元素名称);
RaiseProperty(列表元素的名称);
}
}
单击按钮后,第一个列表(基于数组构建)将被新元素重新填充(看起来像是new ItemsSource),因此我可以看到第二个元素中有一些闪烁和变化

同时,在第二个列表中没有任何更改-对绑定源的引用没有更改,因此我们在屏幕上看不到差异(PropertyChange没有任何影响,因为没有更改任何属性)-这很清楚

那么,为什么ItemsSource设置为array的列表行为不同呢


(尽管上面几乎是全部代码)

这听起来很奇怪,但我从未遇到过这个问题,因为我在可观察的集合中使用ElementViewModel对象。我没有更改列表项/数组元素,而是更改ElementViewModel的一个属性,并在那里使用INotifyProperty更改。这不是你问题的实际答案,但你可以解决这个问题

我不是在寻找如何让它工作的答案,我想知道这种行为的区别。我已经解决了这个问题,但还没有找到答案,因此我发布了这个问题。我想至少有办法让它运行起来。实际上,由于其他人无法复制,可能您使用的框架版本存在缺陷,需要更新?因为实际上,您正在执行的NotifyCollectionChange应该刷新整个值=包括所有元素的整个列表。。。在这里不需要一个可观察的集合-除非你有很多条目,否则需要进行优化。我不能重新设计这种行为(在WPF应用程序中)。当然,我也不希望在替换数组元素的背后有什么魔力。当您替换其一个元素时,数组实例不会更改,因此绑定不会更新,即使您触发PropertyChanged事件。您实际需要的是一个实现INotifyCollectionChanged的集合,例如ObservableCollection。@Clemens我就是这么想的-数组实例不会改变。如果在WPF中工作不一样,那么我添加了一个标签UWP,它应该很容易复制。非常有趣!顺便说一句,调用RaiseProperty(数组元素的名称);足够触发刷新(=看到“小闪烁”),您甚至不需要更改数组中的项目。@gregkalapos是的,看起来数组是重新分配的。元素中的更改只是为了确保与列表中的行为相同。我也无法在Silverlight中重现此行为。注意:不仅
string[]
将通知基础属性的更改,
object[]
也将通知基础
MyItem
Name
更改。这越来越有趣了。:)