我在VB WPF应用程序中有一个可编辑的DataGrid。 DataGrid本身的SourceUpdated属性设置为我的事件处理程序。网格中的2列是可编辑的,并且将Binding中的NotifyOnSourceUpdated标志设置为True。该事件正在解雇,但我似乎无法找出确定变化的最佳方法。 2列相互依赖,其中一列是项目数量,另一列是案例数量。如果用户更改其中一个,我想重新计算另一个值并更新网格和绑定源。我确信有很多方法可以解决这个问题,但我很好奇最好的方法是什么。我可以在datagrid上监听更改事件,查看更改内容,设置一些变量,然后在SourceUpdated事件中使用它们,但这看起来并不优雅。有什么建议吗?
答案 0 :(得分:1)
我建议你走出活动处理人员的世界! WPF不鼓励采用旧的WinForms方法在事件处理程序中执行所有操作。
MVVM方式....
您必须以MVVM方式利用模型类的强大功能。数据网格的绑定集合必须是某些项目的集合...例如如果您的数据网格显示Employees
列表,那么您的集合必须是IEnumerable<Employee>
...所以Employee
类可以在这里帮助您。
假设您的数据网格将Gender
和Saluation
显示为两个相互关联的可编辑列。所以你的Employee
课应该有以下内容......
1. `Employee` class must implement `INotifyPropertyChanged` interface.
2. `Gender` and `Salutation` properties must raise the `PropertyChanged` event from their property setters.
3. In the setter of `Gender` \ `Salutation` we must write the logic of changing the other field.
E.g。
private string _gender;
public string Gender
{
get
{
return _gender;
}
set
{
if (_gender != value)
{
_gender = value;
if (_gender == "Male")
{
Salutation = "Mr";
}
else if (_gender == "Female"
&& (Salutation == "Mr" || string.IsNullOrEmpty(Salutation)))
{
Salutation = "Ms";
}
else if (string.IsNullOrEmpty(_gender))
{
Salutation = string.Empty;
}
OnPropertyChanged("Gender");
}
}
}
private string _salutation;
public string Salutation
{
get
{
return _salutation;
}
set
{
if (_salutation != value)
{
_salutation = value;
if (_salutation == "Mrs" || _salutation == "Ms")
{
Gender = "Female";
}
else if (_salutation == "Mr")
{
Gender = "Male";
}
else if (string.IsNullOrEmpty(_salutation))
{
Gender = string.Empty;
}
OnPropertyChanged("Salutation");
}
}
}
OnPropertyChanged()
是......
public void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
这样,您的GUI将自动执行相关字段的转换。
ValueConverter方式......
如果您的字段不是存储在模型中但仅用于显示目的,那么您可以使用ValueConverter
....
public class GenderToSalutationConverter : IValueConverter
{
#region IValueConverter Members
public object Convert
(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
var _gender = (string) value;
if (_gender == "Male")
{
return "Mr";
}
else if (_gender == "Female")
{
return "Ms";
}
return string.Empty;
}
public object ConvertBack
(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
var _salutation = (string)value;
if (_salutation == "Mrs" || _salutation == "Ms")
{
return "Female";
}
else if (_salutation == "Mr")
{
return "Male";
}
return string.Empty;
}
#endregion
}
XAML 中的
<UserControl.Resources>
<local:GenderToSalutationConverter x:Key="GenderToSalutationConverter"/>
</UserControl.Resources>
<tk:DataGrid ItemsSource="{Binding Employees}">
<tk:DataGrid.Columns>
<tk:DataGridTextColumn
Header="Sex"
Binding="{Binding Gender,
Converter={StaticResource GenderToSalutationConverter}}">
</tk:DataGridTextColumn>
<tk:DataGridTextColumn
Header="Title"
Binding="{Binding Salutation}">
</tk:DataGridTextColumn>
</tk:DataGrid.Columns>
</tk:DataGrid>
希望这会有所帮助......