5

我的问题/情况与Wpf DataGrid SelectedItem 在单元格编辑后失去绑定非常相似,但我没有使用任何“自定义”WPF 框架。我有一个实现INotifyPropertyChangedand的模型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;
            }
        }
    }
}
4

1 回答 1

9

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

于 2013-06-29T22:27:43.593 回答