首页 > 解决方案 > C# WinForms 数据绑定参数异常

问题描述

我正在为 WinForms 数据绑定而苦苦挣扎。问题是控件应该绑定到模型,但它们只是在ArgumentException没有任何合理理由的情况下抛出。它恰好在 aTabPage显示有问题的控件时被抛出。这是以下内容Exception.Message:无法链接数据源中的属性或 Mpn 列。

所以,我无法弄清楚出了什么问题。好像没问题。

值得一提的是,我正在对 WinForms 实施“强制”MVVM,并且该模式到目前为止运行良好(哈哈!)。我已经知道 MVVM 更适合 WPF 和 Silverlight,所以请关注这个问题。

我留下下面的代码和一些关于它们是如何组成的解释:

视图:它有一个TabControl内部有许多选项卡的页面,并且这些页面TabPage具有控件,例如:LabelsTextBoxComboBox

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();
   }
}

视图模型

   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);

不要像我一样做傻瓜哈哈!

标签: c#winformsexceptiondata-binding

解决方案


推荐阅读