我建议你走出事件处理程序的世界! 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.
例如
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>
希望这会有所帮助...