c# - string[] 和 List<string> 的不同绑定(bind)行为

标签 c# xaml binding windows-10 uwp

我试图理解(但没有成功)为什么当源对象是 string[] 时绑定(bind)行为不同和 List<string> .我有两个列表,它们唯一的区别是 ItemsSource - 在一个例子中是 array 在第二个 List 中:

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),因此我可以看到一点点闪烁和第二个元素的变化。

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

那么为什么将 ItemsSource 设置为数组的列表表现不同?

Sample to reproduce the issue (虽然几乎整个代码都在上面)

最佳答案

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

关于c# - string[] 和 List<string> 的不同绑定(bind)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33608268/

相关文章:

c# - 如何使用 ResourceDictionary 将样式设置为窗口

c# - 在 MVVM 中绑定(bind)时出现 WPF 线程绑定(bind)访问错误

javascript - 客户端 JavaScript 的 sprintf 等价物

C# 和 SDL - 最终用户是否需要安装 SDL?

c# - 如何在 asp.net 中存储用户数据?

silverlight - 如何在 MVVM Light 中关闭 TabItem

objective-c - NSOutlineView 不更新

.net - 如何反转 BooleanToVisibilityConverter?

c# - SQL 查询跟踪问题

c# - RestSharp 可以在不使用多部分内容类型的情况下发送二进制数据吗?