2016-06-28 5 views
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 
     } 
    } 
} 

答えて

関連する問題