2012-10-14 83 views
1

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

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

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

干杯,
Berryl

代码

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(); 
    } 
} 

回答

1

This post给了我一个线索如何做到这一点,大致为:

  1. 添加IsReadOnly属性到绑定视图模型项目
  2. 将IsNew属性添加到绑定视图模型项目
  3. 在VM,其实之前加入该项目,将所有现有项目IsReadOnly =真
  4. 当新添加的项编辑或它的编辑取消,IsReadOnly所有项目设置为false
  5. 修改类似行为在发布的答案(这奇怪的是并没有公认的答案),但没有ReadOnlyService
  6. 风格的DataGridRow

回报

enter image description here

enter image description here