我的問題/情況與Wpf DataGrid SelectedItem loses binding after cell edit非常相似,但我沒有使用任何「自定義」WPF框架。我有一個模型,實現了INotifyPropertyChanged
和IEditableObject
,並將網格綁定到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;
}
}
}
}
在您的selecteditem屬性中,您應該只針對selecteditem調用onpropertychanged而不是命令的內容。爲什麼不能使用正常的數據網格? – blindmeis
爲什麼你這樣做:row.BindingGroup = null?也許你自己刪除綁定。你會添加'SelectItemCommand.NotifyCanExecuteChanged(); RemoveItemCommand.NotifyCanExecuteChanged();'實現?因爲'blindmeis'表示你可以爲所選項目調用'onpropertychanged'。 –
@blindmeis:您的評論與被問到的問題無關。但是,要回答你的問題:虛擬機不直接實現INotifyPropertyChanged(它是通過方面應用的)。儘管WPF已經習慣了,但它不再「輪詢」ICommand.CanExecute(),因此我必須在改變它時通知Command實例關心可能已經發生。 –