В WPF мы можем связать свойство выбранного элемента ViewModel непосредственно со свойством DataGrid.SelectdItem через XAML, но кажется, что WinForms DataGridView не имеет этой функции:
< ул>
[*]
Код: Выделить всё
DataGridView.SelectedRows
[*]
Код: Выделить всё
DataGridView.CurrentRow
[*]
Код: Выделить всё
DataGridView.CurrentCell
Код: Выделить всё
var currentRowBinding = myDataGrid.DataBindings.Add("CurrentCell",
mViewModel.Items,
nameof(mViewModel.CurrentItem),
true);
// The Binding.Format event is fired when the value changes in the DataSource
// and needs to be displayed in the control, but needs formatting before that.
currentRowBinding.Format += CurrentRowBinding_Format;
// The Binding.Parse event is fired when the value changes in the control and needs
// to be updated in the DataSource, but it needs to be parsed/transformed before that.
currentRowBinding.Parse += CurrentRowBinding_Parse;
private void CurrentRowBinding_Format(object? sender, ConvertEventArgs e)
{
var itemIndex = mViewModel.Items.IndexOf(mViewModel.CurrentItem);
e.Value = myDataGrid[0, itemIndex];
myDataGrid.Rows[itemIndex].Selected = true;
}
private void CurrentRowBinding_Parse(object? sender, ConvertEventArgs e)
{
e.Value = myDataGrid.CurrentRow.DataBoundItem;
}
Мое решение было таким: для прослушивания события BindingContext CurrencyManager.CurrentChanged формы, для синхронизации моего свойства ViewModel.CurrentItem с текущей строкой, выбранной в сетке; и создайте событие CurrentItemChanged в моей ViewModel, чтобы синхронизировать любые изменения, внесенные из ViewModel в свойство ViewModel.CurrentItem, с текущей строкой в сетке:
Код: Выделить всё
private void CurrencyManager_CurrentChanged(object? sender, EventArgs e)
{
if (mCurrencyManager.Current != mViewModel.CurrentItem)
{
mViewModel.CurrentItem = mCurrencyManager.Current as TViewModel;
}
}
private void ViewModel_CurrentItemChanged(object? sender, EventArgs e)
{
if (mViewModel.CurrentItem != mCurrencyManager.Current)
{
var itemIndex = mViewModel.Items.IndexOf(mViewModel.CurrentItem);
mCurrencyManager.Position = itemIndex;
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ected-item