string []和List <string>的不同绑定行为

时间:2015-11-09 11:37:18

标签: c# xaml binding windows-10 uwp

我尝试理解(没有成功)当源对象为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 设置为数组的列表会有不同的行为?

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

1 个答案:

答案 0 :(得分:-3)

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