string[]和List<;字符串>;

本文关键字:lt 字符串 gt List string | 更新日期: 2023-09-27 18:21:07

我试图理解(但没有成功)为什么当源对象是string[]List<string>时绑定表现不同。我有两个列表,它们唯一的区别是ItemsSource-在一种情况下,数组在第二种情况下列表

XAML代码:

<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button Content="Modify items" Click="Button_Click"/>
    <StackPanel Orientation="Horizontal">
        <StackPanel.Resources>
            <DataTemplate x:Key="ItemTemplate">
                <TextBlock Text="{Binding}" FontSize="16"/>
            </DataTemplate>
        </StackPanel.Resources>
        <ListView ItemsSource="{Binding ArrayElements}" ItemTemplate="{StaticResource ItemTemplate}" Width="100" Margin="20"/>
        <ListView ItemsSource="{Binding ListElements}" ItemTemplate="{StaticResource ItemTemplate}" Width="100" Margin="20"/>
    </StackPanel>
</StackPanel>

代码背后:

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<string> ListElements { get; } = new List<string> { "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设置为数组的列表行为不同呢?

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

string[]和List<;字符串>;

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