0

我的程序中有一个要求,即一旦在组合框中选择了一个项目,组合框中的对象绑定(来自 ViewModel)就会更新。目前,对象仅在通过按 Enter 或离开单元格提交编辑后更新。用户不想要额外的步骤。

我的想法是让在组合框中选择一个项目的行为触发 CommitEdit() 方法,然后触发 CancelEdit()。但是,我似乎无法找到一种方法来挂钩 DataGridComboBoxColumn 的 SelectionChanged 事件,因为它不可用。

其他建议是在视图模型中侦听属性更改事件,但在单元格编辑完成之前不会更改属性。

谁能想到一种方法来导致在 DataGridCombobox 中选择新项目(索引)以关闭单元格的编辑,就像用户按下 Enter 或离开单元格一样?

注意:由于客户限制,我不能使用 .NET 4.5。

4

1 回答 1

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 中添加了以下样式,因为我使用资源字典作为样式(您当然可以在数据网格中添加)。

<Style TargetType="{x:Type Custom:SpDataGrid}">
     <Setter Property="Custom:SpDataGrid.ComboBoxSelectionChangedCommand" Value="{Binding ComboBoxSelectionChanged}"/>
 </Style>

ComboBoxSelectionChanged 是我的视图模型中的命令。OnComboBoxSelectionChanged 我评论了 commitedit,因为在我的情况下,值已经更新。

如果有任何不清楚或有任何问题,请告诉我。希望这可以帮助。

于 2013-01-24T20:10:14.967 回答