简体   繁体   English

当绑定到IEnumerable且引用保持不变时,忽略PropertyChanged

[英]PropertyChanged is ignored when Binding to IEnumerable where reference stays the same

I created a minimal example to illustrate the binding issue. 我创建了一个最小的示例来说明绑定问题。 IEnumerable<string> NewReference gets updated as expected. IEnumerable<string> NewReference得到了预期的更新。 IEnumerable<string> SameReference is not updated, presumably because the reference is the same. IEnumerable<string> SameReference未更新,可能是因为引用相同。 Raise("SameReference"); was not enough to make WPF update the reference. 不足以使WPF更新参考。

Is there something that can be done to make the WPF framework revaluate SameReference even though it has the same reference? 即使WPF框架具有相同的引用,是否可以使WPF框架重估SameReference

xaml: XAML:

<Window x:Class="Stackoverflow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="Azure">
        <Grid.RowDefinitions>
            <RowDefinition Height="5*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Content="Update" Margin="5" Grid.Row="1" Grid.ColumnSpan="2" Click="Button_Click" />
        <ListBox ItemsSource="{Binding SameReference}" Margin="5" />
        <ListBox ItemsSource="{Binding NewReference}" Margin="5" Grid.Column="1" />
    </Grid>
</Window>

xaml.cs: xaml.cs:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace Stackoverflow
{
    public partial class MainWindow : Window , INotifyPropertyChanged
    {
        public List<string> data = new List<string> {  };
        public IEnumerable<string> SameReference { get { return data; } } //this returns a reference to an unchanged object
        public IEnumerable<string> NewReference { get { return new List<string>(data); } } //this returns a reference to a new object
        //ObservableCollection<string> conventional is known but not the point of this question

        public event PropertyChangedEventHandler PropertyChanged;

        private void Raise(string propertyName)
        {
            if(null != PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            data.Add("This is data.");
            Raise("SameReference"); //successful notify, ignored values
            Raise("NewReference"); //successful notify, processed values
        }
    }
}

That is intentional behavior. 那是故意行为。 If you want collections to update implement INotifyCollectionChanged (or use a class that already does, like ObservableCollection<T> ). 如果要集合更新实现INotifyCollectionChanged (或使用已经INotifyCollectionChanged的类,例如ObservableCollection<T> )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM