[英]How to set value in WPF datagridtextcolumn cell when the datagridcombobox cell value is changed?
我正在使用WPF 4.0 Datagrid開發應用程序。 我的Datagrid網格具有一個datagridcombobox列和一個datagridtext列。 如何使用datagridcomboboxcolumn的SelectedIndex_Changed事件更改datagrid文本單元格值?
我建議使用MVVM方法創建WPF應用程序。 通常,這意味着您將停止處理離散事件(如SelectedIndex_Changed
,而是綁定到ViewModel(VM)和/或Model(M)中的可觀察對象。
使用這種體系結構,解決問題很容易。 只需將DataGridComboBoxColumn的SelectedItemBinding
綁定到DataGrid的ItemSource對象的屬性即可。 然后,將您的DataGridTextColumn綁定到該屬性。 這在代碼中有更好的解釋:
視圖:
<!-- Previous Window XAML omitted, but you must set it's DataContext to the ViewModel -->
<DataGrid
CanUserAddRows="False"
AutoGenerateColumns="False"
ItemsSource="{Binding People}"
>
<DataGrid.Columns>
<DataGridTextColumn
Header="Selected Name"
Binding="{Binding Name}"
/>
<DataGridComboBoxColumn
Header="Available Names"
SelectedItemBinding="{Binding Name}"
>
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Names}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Names}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
ViewModel:
internal class MainWindowViewModel : ViewModelBase
{
private ObservableCollection<Person> _people;
public ObservableCollection<Person> People
{
get
{
_people = _people ?? new ObservableCollection<Person>()
{
new Person(),
new Person(),
new Person(),
};
return _people;
}
}
}
模型:
internal class Person : INotifyPropertyChanged
{
private static ObservableCollection<string> _names = new ObservableCollection<string>()
{
"Chris",
"Steve",
"Pete",
};
public ObservableCollection<string> Names
{
get { return _names; }
}
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
this.RaisePropertyChanged(() => this.Name);
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged<T>(Expression<Func<T>> expr)
{
var memberExpr = expr.Body as MemberExpression;
if (memberExpr != null)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(memberExpr.Member.Name));
}
}
else
{
throw new ArgumentException(String.Format("'{0}' is not a valid expression", expr));
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.