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

问题描述 投票:0回答:2

我的问题/情况与Wpf DataGrid SelectedItem在单元格编辑后失去绑定非常相似,但我没有使用任何“自定义”WPF框架。我有一个实现

INotifyPropertyChanged
IEditableObject
的模型,以及绑定到
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;
            }
        }
    }
}
c# wpf xaml mvvm
2个回答
11
投票

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


0
投票

根据我的经验,这个问题的确切原因是我自己错误地实现了

GetHashCode()
。我的实现使用可变属性(字符串“Name”属性)计算哈希,这破坏了集合。

只需更改

GetHashCode()
覆盖以仅使用不可变属性就为我解决了这个问题。顺便说一句,一旦纠正了
SelectedItem
,在
DataGrid
上使用
GetHashCode
就可以工作。

这里是您自己实施

GetHashCode
的指南。

© www.soinside.com 2019 - 2024. All rights reserved.