我有一个包含三列的数据网格,如下所示:
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>
答案 0 :(得分:2)
在PropertyChanged
和D
属性的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。
然后你会得到公式的每个组成部分 - 在这种情况下为A
和B
- 然后你去他们的制定者并简单地添加公式的OnPropertyChanged
- {{1} } - 在D
组件之后 - OnPropertyChanged
和A
。
这是因为当且仅当其组件执行时,公式才会更改:这解释了必须从哪里发送通知。