2013-06-26 95 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行數或選定的索引?行數最好是視圖綁定到的陣列的長度/數量(在您的虛擬機上),這意味着您已經可以訪問此信息。 –