WPF DataGrid SelectedItem绑定在项更改后停止工作

本文关键字:停止工作 DataGrid SelectedItem 绑定 WPF | 更新日期: 2023-09-27 18:20:04

我的问题/情况与Wpf DataGrid SelectedItem在单元格编辑后丢失绑定非常相似,但我没有使用任何"自定义"Wpf框架。我有一个实现INotifyPropertyChangedIEditableObject的模型,以及一个绑定到ObservableCollection<T>的网格。网格的SelectedItem属性绑定到VM上的一个属性。

有了一个断点,当我在网格中选择不同的行时,我可以看到我的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;
            }
        }
    }
}

WPF DataGrid SelectedItem绑定在项更改后停止工作

显然,DataGrid上的SelectedItem依赖属性已损坏,没有正确使用。在使用OnPropertyChanged进行了一些调试之后,我发现网格实际上正在可靠地设置"CurrentItem"属性。我改为使用CurrentItem,一切似乎都正常工作。。。用户的"选定行"被发送到虚拟机而没有发生意外。