none
DataGridのINotifyPropertyChanged RRS feed

  • 質問

  • お世話になります。

    DataGridとINotifyPropertyChangedを使って開発しています。

     

    データグリッド内で列Aと列Bの値を足した結果を列C に動的に反映したいんですがうまくいきません。

    なぜでしょうか?

    xamlファイル

    <DataGrid AutoGenerateColumns="False" Name="dataGrid1" ItemsSource="{Binding}">
    	<DataGrid.Columns>
    		<DataGridTemplateColumn Header="A">
    			<DataGridTemplateColumn.CellTemplate>
    				<DataTemplate>
    					<TextBox Text="{Binding Path=A,Mode=TwoWay}" />
    				</DataTemplate>
    			</DataGridTemplateColumn.CellTemplate>
    		</DataGridTemplateColumn>
    		<DataGridTemplateColumn Header="B">
    			<DataGridTemplateColumn.CellTemplate>
    				<DataTemplate>
    					<TextBox Text="{Binding Path=B,Mode=TwoWay}" />
    				</DataTemplate>
    			</DataGridTemplateColumn.CellTemplate>
    		</DataGridTemplateColumn>
    		<DataGridTemplateColumn Header="C">
    			<DataGridTemplateColumn.CellTemplate>
    				<DataTemplate>
    					<TextBox Text="{Binding Path=C,Mode=TwoWay}" />
    				</DataTemplate>
    			</DataGridTemplateColumn.CellTemplate>
    		</DataGridTemplateColumn>
    	</DataGrid.Columns>
    </DataGrid>
    
    

    csファイル

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
    	public MainWindow()
    	{
    		InitializeComponent();
    
    		var calcList = new List<Calc>();
    		var calc = new Calc(1, 2, 3);
    		calc.PropertyChanged += new PropertyChangedEventHandler(calc_PropertyChanged);
    		calcList.Add(calc);
    		this.dataGrid1.DataContext = calcList;
    	}
    
    	void calc_PropertyChanged(object sender, PropertyChangedEventArgs e)
    	{
    	}
    }
    
    public class Calc : System.ComponentModel.INotifyPropertyChanged
    {
    	public Calc(int a, int b, int c)
    	{
    		mA = a;
    		mB = b;
    		mC = c;
    	}
    	private int mA;
    	private int mB;
    	private int mC;
    
    	public int A
    	{
    		get { return this.mA; }
    		set
    		{
    			if (value != this.mA)
    			{
    				this.mA = value;
    				NotifyPropertyChanged("Name");
    			}
    		}
    	}
    
    	public int B
    	{
    		get { return this.mB; }
    		set
    		{
    			if (value != this.mB)
    			{
    				this.mB = value;
    				NotifyPropertyChanged("DueDate");
    			}
    		}
    	}
    
    	public int C
    	{
    		get { return this.mC; }
    		set
    		{
    			if (value != this.mC)
    			{
    				this.mC = value;
    				NotifyPropertyChanged("Complete");
    			}
    		}
    	}
    
    	public event PropertyChangedEventHandler PropertyChanged;
    
    	private void NotifyPropertyChanged(string propertyName)
    	{
    		if (PropertyChanged != null)
    		{
    			PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    		}
    	}
    }
    
    

    この状態で起動すると以下のようになります。

    A,B,C

    1,2,3

    ここでAの1を2にしたらCが4になるようにしたいんですが、Aの値を変えてもcalc_PropertyChangedが実行されません。

    なぜでしょうか?

    2011年8月7日 8:57

回答

すべての返信

  • プロパティ名が A B C なのに、NotifyPropertyChanged で Name だの DueDate だの Complete の変更通知していては駄目でしょう。

    A と B の計算結果が自動的に C に反映されるなら、A および B のプロパティの set 内で mC もセットして、C の変更通知もついでに投げるとか。

    C が外部から変更可能だと、C を勝手に書き換えられて A および B から算出される結果と整合性がとれなくなると思いますが問題ないんでしょうか?

    2011年8月7日 9:32
  • Hongliangさん回答ありがとうございます。

     

    >プロパティ名が A B C なのに、NotifyPropertyChanged で Name だの DueDate だの Complete の変更通知していては駄目でしょう。

    仰る通りです。

    NotifyPropertyChanged("Name");を

    NotifyPropertyChanged("A");に修正しましたが、そもそもDataGridでAの値を変えてもプロパティAのsetが実行されません。

    なぜでしょうか?

     

    >C が外部から変更可能だと、C を勝手に書き換えられて A および B から算出される結果と整合性がとれなくなると思いますが問題ないんでしょうか?

    仕様を検討中ですが、Cを読み取り専用にする予定です。

    2011年8月7日 9:57
  • BindingのUpdateSourceTriggerをPropertyChangedにしてみるとどうでしょうか??

    http://msdn.microsoft.com/ja-jp/library/system.windows.data.binding.updatesourcetrigger(v=VS.100).aspx


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク yty0918 2011年8月7日 14:44
    2011年8月7日 12:56
  • かずき_okazukiさん回答ありがとうございます。

     

    >BindingのUpdateSourceTriggerをPropertyChangedにしてみるとどうでしょうか??

    それでいけました!完璧です!

    UpdateSourceTrigger=PropertyChangedを追加して、プロパティAとBのsetにA+Bの計算式を入れたら期待通りの結果が得られました。

    ありがとうございました!

    2011年8月7日 14:44