我的程序中有一个要求,即在组合框中选择一个项目后,Combobox中绑定的对象(来自ViewModel)会立即更新。目前,只有在按Enter键或离开单元格提交编辑后,对象才会更新。用户不需要额外的步骤。
我的想法是在组合框中选择项目的行为触发CommitEdit()方法,然后触发CancelEdit()。但是,我似乎无法找到一种方法来挂钩DataGridComboBoxColumn的SelectionChanged事件,因为它不可用。
其他建议是在viewmodel中侦听属性更改事件,但在Cell Edit完成之前不会更改属性。
有人会想到一种方法可以在DataGridCombobox中选择一个新项目(索引)来关闭单元格的编辑,就像用户按下Enter或离开单元格一样吗?
注意:由于客户限制,我无法使用.NET 4.5。
答案 0 :(得分:1)
我有类似的问题,但我刚刚找到了使用附加属性的解决方案,这可能无法完全解决您的问题,但它将有助于数据网格选择更改问题。
以下是附加属性和处理程序方法
public static readonly DependencyProperty ComboBoxSelectionChangedProperty = DependencyProperty.RegisterAttached("ComboBoxSelectionChangedCommand",
typeof(ICommand),
typeof(SpDataGrid),
new PropertyMetadata(new PropertyChangedCallback(AttachOrRemoveDataGridEvent)));
public static void AttachOrRemoveDataGridEvent(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
DataGrid dataGrid = obj as DataGrid;
if (dataGrid != null)
{
if (args.Property == ComboBoxSelectionChangedProperty)
{
dataGrid.SelectionChanged += OnComboBoxSelectionChanged;
}
}
else if (args.OldValue != null && args.NewValue == null)
{ if (args.Property == ComboBoxSelectionChangedProperty)
{
dataGrid.SelectionChanged -= OnComboBoxSelectionChanged;
}
}
}
private static void OnComboBoxSelectionChanged(object sender, SelectionChangedEventArgs args)
{
DependencyObject obj = sender as DependencyObject;
ICommand cmd = (ICommand)obj.GetValue(ComboBoxSelectionChangedProperty);
DataGrid grid = sender as DataGrid;
if (args.OriginalSource is ComboBox)
{
if (grid.CurrentCell.Item != DependencyProperty.UnsetValue)
{
//grid.CommitEdit(DataGridEditingUnit.Row, true);
ExecuteCommand(cmd, grid.CurrentCell.Item);
}
}
}
SpDataGrid是我从数据网格继承的自定义控件。
我在generic.xaml中添加了以下样式,因为我使用了resourcedictionary的样式(你当然可以在datagrid里面添加)。
<Style TargetType="{x:Type Custom:SpDataGrid}">
<Setter Property="Custom:SpDataGrid.ComboBoxSelectionChangedCommand" Value="{Binding ComboBoxSelectionChanged}"/>
</Style>
ComboBoxSelectionChanged是我的viewmodel中的命令。 OnComboBoxSelectionChanged我评论了commitedit,因为在我的情况下,值已经更新。
如果有任何不清楚或有任何问题,请告诉我。希望这会有所帮助。