2017-02-14 7 views
0

以下に示すように、私は3つの列を持つデータグリッドを有する:別の列の計算に一つの列内のセルの値の変更を反映する - データグリッドWPF C位

Datagrid

データグリッドを観察コレクションを介して取り込まれます。

ビューモデルは次のように定義されます

DataGrid内
public class PlanningResult : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public double A { get; set; } 
    public double B { get; set; } 
    public double D { get; set; } 
} 

ObservableCollection<PlanningResult> populatePatternData = new ObservableCollection<PlanningResult>(); 
public ObservableCollection<PlanningResult> PopulatePatternData 
{ 
    get { return populatePatternData; } 
    set 
    { 
     populatePatternData = value; 
     base.OnPropertyChanged("StringList"); 
    } 
} 

、ユーザーが列Aのセルの値を変更することが許可されている私は、UIからそれを達成することができていますが、どのように私は、内のセルの値の変更を反映しますA列のセルの値が変化したときの列D?ここで

はXAMLです:

public class PlanningResult : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private double _a; 
    public double A 
    { 
     get { return _a; } 
     set { _a = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); } 
    } 

    private double _b; 
    public double B 
    { 
     get { return _b; } 
     set { _b = value; NotifyPropertyChanged(); NotifyPropertyChanged("D"); } 
    } 

    public double D { get { return _a + _b; } } 
} 

また、読み取りのModeに注意してください。

<DataGrid x:Name="PrintReport" ItemsSource="{Binding PopulatePatternData}" AutoGenerateColumns="False"> 
    <DataGridTextColumn Header="A" Binding="{Binding A,StringFormat={}{0:0.00}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False" /> 
    <DataGridTextColumn Header="B" Binding="{Binding B,StringFormat={}{0:0.00}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" /> 
    <DataGridTextColumn Header="D" Binding="{Binding D,StringFormat={}{0:0.00}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" /> 
</DataGrid> 
+0

ところで、これはタイプミスですか? OnPropertyChanged( "StringList"); ただOnPropertyChanged()である必要はありません。 ? –

答えて

2

ABプロパティのセッターでDプロパティのPropertyChangedイベントを上げますプロパティはデフォルト値のOneWayでなければなりません。

<DataGridTextColumn Header="D" Binding="{Binding D,StringFormat={}{0:0.00}}" IsReadOnly="True" /> 
+0

ユーザーがAまたはBで変更を開始する前に、最初に "D"に値のセットを設定したいのですが、それはできますか? @ mm8 – user7157732

+0

コレクションを介して列Dに値を入力しようとすると、「プロパティ」が読み取れないというエラーが発生します。 @ mm8 – user7157732

+0

私の答えを見る:http://stackoverflow.com/questions/42271975/datagrid-error-viemodel-property-cant-be-populated-c-sharp-wpf/42272106#42​​272106 – mm8

1

私はこのような状況のための一般的なパターンを持っている: あなたはいつものように、通常の性質を有する式のコンポーネントを定義し、依存プロパティで - あなたのケースでD = A + Bあなただけのゲッターを書きます。この場合ABに - -

その後、式の各コンポーネントを取ると、あなたはそれらのセッターに行き、単に式のOnPropertyChangedを追加 - D - そのコンポーネントのOnPropertyChanged後 - ABを。

これは、式がの場合、の場合にのみ、通知が送信される場所を説明するためです。

関連する問題