WPF DataGrid pas de mise à jour sur PropertyChanged

j'ai un problème de mise à jour de mon datagrid en cliquant sur le bouton en utilisant NotifyPropertyChanged.
Il fonctionne si j'ai mis la grille de données.ItemsSource dans le code derrière, mais il n'est pas si je l'ai mis dans le code xaml.
voici un code de code-behind, & xaml:

namespace MyWpfDataBindingLab
{
public partial class NpcWindow : Window
{
DataCollection dc = new DataCollection();
public NpcWindow()
{
InitializeComponent();
//command binding code
//...
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//if i set the ItemsSource here, updating of the UI works
//dataGrid1.ItemsSource = dc;
}
private void CmdCollectionChangedExecute(object sender, ExecutedRoutedEventArgs e)
{
foreach (SampleClass s in dc)
{
s.Property1 = "changed";
s.Property3 = "changed";
s.Property3 = "changed";
break;
}
dc.Add(new SampleClass("new sample 1", "new sample 2", "new sample 3"));
}
}
}
<Window x:Class="WPFDataBinding.NpcWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:npc="clr-namespace:WPFDataBinding.NotifyPropChanged"
Title="MainWindow" Height="189" Width="459" Loaded="Window_Loaded">
<Window.Resources>
<npc:DataCollection x:Key="dataCol"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="349,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
<!-- if i set the ItemsSource here, updating of the UI doesn't work -->
<DataGrid ItemsSource="{Binding Source={StaticResource dataCol}, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="True" Height="103" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="331" />
</Grid>

mes données & NotifyPropertyChanged mise en œuvre:

namespace MyWpfDataBindingLab.NotifyPropChanged
{    
public class SampleClass : NotifyPropertyChanged
{
private string _field1;
private string _field2;
private string _field3;
public string Property1
{ 
get { return _field1; } 
set 
{
_field1 = value;
OnPropertyChanged("Property1");
}
}
public string Property2
{ 
get { return _field2; } 
set 
{
_field2 = value;
OnPropertyChanged("Property2");
}
}
public string Property3
{ 
get { return _field3; } 
set 
{
_field3 = value;
OnPropertyChanged("Property3");
}
}
public SampleClass()
{
_field1 = "value1";
_field2 = "value2";
_field3 = "value3";
}
public SampleClass(string p1, string p2, string p3)
{
_field1 = p1;
_field2 = p2;
_field3 = p3;
}
}
}
namespace MyWpfDataBindingLab.NotifyPropChanged
{
public abstract class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
namespace MyWpfDataBindingLab.NotifyPropChanged
{
public class DataCollection : ObservableCollection<SampleClass> 
{
public DataCollection()
{
this.Add(new SampleClass());
this.Add(new SampleClass());
this.Add(new SampleClass());
}
}
}

je n'ai aucune idée de ce qu'est le problème. je l'apprécierais si quelqu'un peut aider à la résolution de mon problème.

Avez-vous un code qui fait ajoute des éléments à l'instance de DataCollection? Si vous ajoutez de rien puis de la CmdCollectionChangedExecute gestionnaire ne se déclenche pas.
la collection est mise à jour via CmdCollectionChangedExecute en cliquant sur le bouton. le nom de la méthode est un peu déroutant. il devrait être CmdCollectionChangeExecute. la mise à jour fonctionne très bien, mais l'interface utilisateur est uniquement la mise à jour si la valeur de la ItemsSource dans le code derrière. je tiens à le faire uniquement dans le fichier xaml.

OriginalL'auteur nllpntr | 2012-09-08