Привязка выбранной строки WinForms DataGridView к свойству выбранного элемента MVVM ViewModelC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Привязка выбранной строки WinForms DataGridView к свойству выбранного элемента MVVM ViewModel

Сообщение Anonymous »

Начиная с версии .NET 7, Microsoft улучшила возможности привязки Windows Forms, чтобы приблизить ее к WPF и другим технологиям XAML: использование привязки команд в приложениях Windows Forms для кроссплатформенности - блог .NET
В WPF мы можем связать свойство выбранного элемента ViewModel непосредственно со свойством DataGrid.SelectdItem через XAML, но кажется, что WinForms DataGridView не имеет этой функции:
< ул>
[*]

Код: Выделить всё

DataGridView.SelectedRows
ожидает набор строк;
[*]

Код: Выделить всё

DataGridView.CurrentRow
доступен только для чтения, поэтому привязка не удалась;
[*]

Код: Выделить всё

DataGridView.CurrentCell
— это способ установить текущую строку сетки, но он ожидает объект DataGridViewCell, и я попробовал использовать его, отформатировав ожидаемое значение (я удалил код проверки и оставил здесь только то, что важно) :

Код: Выделить всё

   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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»