我的问题/情况与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实例关心可能已经发生。 –