El enlace del elemento seleccionado de WPF DataGrid deja de funcionar después de cambiar el artículo
Mi problema / situación es muy similar aWpf DataGrid SelectedItem pierde el enlace después de la edición de la celda pero no estoy usando ningún marco WPF "personalizado". Tengo un modelo que implementa.INotifyPropertyChanged
yIEditableObject
, y una rejilla unida a unObservableCollection<T>
. La cuadrículaSelectedItem
La propiedad está vinculada a una propiedad en la máquina virtual.
Con un punto de quiebre, puedo ver miViewModel.SelectedItem
Cambio de propiedad al seleccionar diferentes filas en la cuadrícula. En el momento en que cambio un valor en una fila, sin embargo, elViewModel.SelectedItem
La propiedad ya no está establecida cuando cambio el enfoque en las filas. La solución identificada en el enlace anterior no funciona, ya que no estoy usando un marco WPF personalizado, solo WPF desnudo.
¿Algunas ideas?
// 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;
}
}
}
}