Исключение аргумента привязки данных C # WinForms - PullRequest
0 голосов
/ 02 декабря 2018

Я борюсь с привязкой данных 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);

Не будь глупым, как я, лол!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...