Я борюсь с привязкой данных WinForms.Проблема в том, что элементы управления должны быть привязаны к модели, но они просто выбрасывают ArgumentException
без какой-либо разумной причины.Он выдается именно тогда, когда TabPage
показывает соответствующий элемент управления.Это следующее Exception.Message
: невозможно связать свойство или столбец Mpn в источнике данных.
Итак, я не могу понять, что происходит не так.Кажется, все в порядке.
Стоит отметить, что я внедряю "принудительный" MVVM в WinForms, и шаблон до сих пор работал нормально (смеется!).Я уже знаю, что MVVM лучше работает с WPF и Silverlight, поэтому, пожалуйста, сосредоточьтесь на проблеме.
Я оставляю код ниже и некоторые пояснения о том, как они составлены:
Просмотр: у него есть TabControl
со множеством вкладок внутри, а у TabPage
есть элементы управления, такие как: Labels
, TextBox
, ComboBox
и т. Д.
public sealed partial class ProductView : ViewBase
public ProductView(ProductViewModel viewModel) : base(viewModel) => InitializeComponent();
public sealed async override void BindViewModel()
{
ProductViewModel pvm = ViewModel as ProductViewModel;
await Task.Run(() => { while (pvm.Loading) ; });
DataSourceUpdateMode updateMode = DataSourceUpdateMode.OnPropertyChanged;
// Product Tab Data
materialTextField_mpn.DataBindings.Add("Text", pvm, nameof(pvm.Product.Mpn), false, updateMode);
}
private void ProductView_Load(object sender, EventArgs e){
(ViewModel as ProductViewModel).Load.Execute(null);
BindViewModel();
}
}
ViewModel
public sealed class ProductViewModel : ViewModelBase
{
private bool loading;
private int product_id;
private readonly IRepository<ProductModel> repository;
private ICommand load;
public ProductViewModel(IRepository<ProductModel> repository) => this.repository = repository;
public ProductModel Product { get; private set; }
private async void LoadData()
{
Loading = true;
product_id = 0; // Hardcoded for testing purposes.
Product = product_id > 0 ? await repository.GetByIdAsync(product_id) : new ProductModel()
{
ID = 0,
Mpn = string.Empty
};
Loading = false;
}
Модель
public class ProductModel : ModelBase
{
private string mpn;
public string Mpn {
get => mpn;
set
{
if (mpn == value)
return;
mpn = value;
OnPropertyChanged(nameof(mpn));
}
}
}
Заранее большое спасибо!
ОБНОВЛЕНИЕ И РЕШЕНИЕ
Поспав некоторое время и вернувшись к коду.Я понял, что привязка данных была неправильной.Вот эта строка:
materialTextField_mpn.DataBindings.Add("Text", pvm, nameof(pvm.Product.Mpn), false, updateMode);
Просто поменяйте на эту:
materialTextField_mpn.DataBindings.Add("Text", pvm.Product, nameof(pvm.Product.Mpn), false, updateMode);
Не будь глупым, как я, лол!