1

我有一个 DataGrid,用户只能使用绑定到视图模型的添加命令输入新行。下面显示的附加行为激活了正确的单元格。

我现在想要做的是有效地使新行“模态”。也就是说,在新行有效并提交之前,我不希望用户能够对网格执行任何其他操作,或者取消编辑。

假设我的视图模型知道它何时有效并实现了 IEditableObject,我可以从我的附加行为中得到所有这些吗?必须做什么?

干杯,
贝里尔

代码

public class NewItemAddedByCommandBehavior : Behavior<DataGrid>
{
    private MainWindowViewModel _vm;

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.DataContextChanged += OnAssociatedObject_DataContextChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.DataContextChanged -= OnAssociatedObject_DataContextChanged;
        _vm.NewItemAddedByCommand -= OnNewItemAddedByCommand;
    }

    private void OnAssociatedObject_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) {
        _vm = (MainWindowViewModel) AssociatedObject.DataContext;
        _vm.NewItemAddedByCommand += OnNewItemAddedByCommand;
    }

    private void OnNewItemAddedByCommand(object sender, EventArgs e)
    {
        var currentItem = _vm.SelectedItem;
        var col = AssociatedObject.Columns[1];
        AssociatedObject.CurrentCell = new DataGridCellInfo(currentItem, col);
        AssociatedObject.ScrollIntoView(currentItem, col);
        AssociatedObject.Focus();
        AssociatedObject.BeginEdit();
    }
}
4

2 回答 2

1

这篇文章给了我一个大致的线索:

  1. 将 IsReadOnly 属性添加到绑定的视图模型项
  2. 将 IsNew 属性添加到绑定的视图模型项
  3. 在vm中,在实际添加item之前,设置所有已经存在的item IsReadOnly = true
  4. 当编辑新添加的项目或取消其编辑时,将所有项目的 IsReadOnly 设置回 false
  5. 修改类似于发布答案的行为(奇怪的是不是接受的答案)但没有 ReadOnlyService
  6. 为 DataGridRow 设置样式

回报

在此处输入图像描述

在此处输入图像描述

于 2012-10-14T22:15:40.037 回答
0
<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
    </Style>
</DataGrid.RowStyle>
于 2021-07-23T09:27:26.053 回答