将一列中的单元格值更改反映到另一列计算中 - Datagrid WPF C#

时间:2017-02-14 19:22:00

标签: c# wpf xaml datagrid

我有一个包含三列的数据网格,如下所示:

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

在datagrid中,允许用户修改A列的单元格值。我能够从UI实现这一点但是当A中的单元格值发生变化时,如何反映D列中的单元格值变化?

这是XAML:

<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>

2 个答案:

答案 0 :(得分:2)

PropertyChangedD属性的setter中提升A属性的B事件:

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应为OneWay,这是默认值:

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

答案 1 :(得分:1)

我有这种情况的通用模式: 您可以像往常一样使用普通属性定义公式组件,并在依赖属性中 - 在您的情况D = A + B中,您只会编写getter。

然后你会得到公式的每个组成部分 - 在这种情况下为AB - 然后你去他们的制定者并简单地添加公式的OnPropertyChanged - {{1} } - 在D组件之后 - OnPropertyChangedA

这是因为当且仅当其组件执行时,公式才会更改:这解释了必须从哪里发送通知。