1
バインディングの問題を示すために最小限の例を作成しました。 IEnumerable<string> NewReference
は期待通りに更新されます。 IEnumerable<string> SameReference
は更新されません。おそらく、参照が同じであるためです。 Raise("SameReference");
は、WPFが参照を更新するのに十分ではありませんでした。参照が同じままであるIEnumerableにバインドする場合、PropertyChangedは無視されます
WPFフレームワークを同じ参照があるのにSameReference
に再評価するためにできることはありますか?
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:
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
}
}
}