2013-06-26 73 views
3

我的问题/情况与Wpf DataGrid SelectedItem loses binding after cell edit非常相似,但我没有使用任何“自定义”WPF框架。我有一个模型,实现了INotifyPropertyChangedIEditableObject,并将网格绑定到ObservableCollection<T>。网格的SelectedItem属性绑定到VM上的属性。WPF DataGrid SelectedItem绑定在项目更改后停止工作

随着中断点,我可以看到我的ViewModel.SelectedItem属性更改,因为我选择网格中的不同行。但是,当我在一行上更改某个值时,ViewModel.SelectedItem属性不再设置,因为我将焦点更改为行。上述链接中标识的解决方案不起作用,因为我没有使用自定义WPF框架,只是使用裸体WPF。

任何想法?

// View model area 
public IPurchaseorderItem SelectedItem 
{ 
    get 
    { 
     return _selectedItem; 
    } 

    set 
    { 
     if (_selectedItem != value) 
     { 
      _selectedItem = value; 
      SelectItemCommand.NotifyCanExecuteChanged(); 
      RemoveItemCommand.NotifyCanExecuteChanged(); 
     } 
    } 
} 

// XAML SelectedItem binding 
<views:NoBindingGroupDataGrid SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

// Special Grid to clear binding groups (read on a similarly themed SO question/answer) 
internal sealed class NoBindingGroupDataGrid : DataGrid 
{ 
    private bool _editing = false; 

    protected override System.Windows.Size MeasureOverride(System.Windows.Size availableSize) 
    { 
     var desiredSize = base.MeasureOverride(availableSize); 
     ClearBindingGroup(); 
     return desiredSize; 
    } 

    protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e) 
    { 
     base.OnCellEditEnding(e); 

     if (!_editing) 
     { 
      _editing = true; 

      CommitEdit(DataGridEditingUnit.Row, true); 

      _editing = false; 
     } 
    } 

    private void ClearBindingGroup() 
    { 
     ItemBindingGroup = null; 

     foreach (var item in Items) 
     { 
      var row = ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; 

      if (row != null) 
      { 
       row.BindingGroup = null; 
      } 
     } 
    } 
} 
+0

在您的selecteditem属性中,您应该只针对selecteditem调用onpropertychanged而不是命令的内容。为什么不能使用正常的数据网格? – blindmeis

+0

为什么你这样做:row.BindingGroup = null?也许你自己删除绑定。你会添加'SelectItemCommand.NotifyCanExecuteChanged(); RemoveItemCommand.NotifyCanExecuteChanged();'实现?因为'blindmeis'表示你可以为所选项目调用'onpropertychanged'。 –

+0

@blindmeis:您的评论与被问到的问题无关。但是,要回答你的问题:虚拟机不直接实现INotifyPropertyChanged(它是通过方面应用的)。尽管WPF已经习惯了,但它不再“轮询”ICommand.CanExecute(),因此我必须在改变它时通知Command实例关心可能已经发生。 –

回答

7

显然DataGrid上的SelectedItem依赖项属性被破坏,并且未被正确使用。在使用OnPropertyChanged进行一些调试后,我发现网格实际上可靠地设置了“CurrentItem”属性。我更改为使用CurrentItem,并且所有内容似乎都正常工作......用户的“选定行”正在发送给虚拟机,而不会发生任何事件。

+0

我需要得到行数。任何想法如何实现这一目标? – MoonKnight

+0

@Killercam行数或选定的索引?行数最好是视图绑定到的阵列的长度/数量(在您的虚拟机上),这意味着您已经可以访问此信息。 –