2012-09-08 245 views
6

NotifyPropertyChangedを使用してボタンをクリックしたときにデータグリッドを更新する際に問題が発生しました。 DataGrid.ItemsSourceをコードの背後に設定すると機能しますが、xamlで設定しても機能しません。私は問題が何であるか見当がつかないWPF DataGridがPropertyChangedで更新されない

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()); 
    } 
} 
} 

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> 

私のデータ& NotifyPropertyChanged実装: はここにいくつかの& XAMLの背後にあるコードのコードです。誰かが私の問題を解決するのを助けることができたら、私はそれを感謝します。あなたの分離コード.xaml.csで

+0

実際に 'DataCollection'のインスタンスに項目を追加するコードはありますか?何も追加しないと、 'CmdCollectionChangedExecute'ハンドラーは起動しません。 – slugster

+0

ボタンをクリックすると、CmdCollectionChangedExecuteを介してコレクションが更新されます。メソッド名はちょっと混乱します。それはCmdCollectionChangeExecuteです。更新はうまくいきますが、コード内でItemsSourceを設定している場合にのみ更新されます。私はそれをxamlファイルでのみ行うのが好きです。 – nllpntr

答えて

9

は、XAMLでプロパティ

public ObservableCollection<SampleClass> MyCollection {get; set;} 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
    //if i set the ItemsSource here, updating of the UI works 
     dataGrid1.ItemsSource = MyCollection; 
    } 

を作成します。

<DataGrid ItemsSource="{Binding Path=., Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/> 
+0

クイックアンサーに感謝します。あなたのコードはうまくいきます。 dataGrid1.ItemsSource = MyCollectionを取り除くことは可能ですか?コードの背後にあり、xamlで完全なバインディングをしますか? – nllpntr

+0

this.DataContext = MyCollectionを使用できます。 – syned

+0

ありがとう!これは私が探していたものです - 私の問題をきれいに解決しました。 – Fred

7

私はのsyned先端にフォローアップ。私のために私はここでの鍵は

UpdateSourceTrigger 

財産だった

Mode=TwoWay 

として私たちにモードを持っていました。

ありがとうございます...!

関連する問題