WPF:数据绑定与在UserControl构造函数中作为参数传递的ObservableCollection

时间:2014-01-03 21:48:20

标签: wpf binding constructor user-controls

我有一个带有ComboBox的UserControl,我正在绑定一个ObservableCollection,如follow。现在,该集合填充在UserControl中。但是,我想在MainWindow中创建ObservableCollection,并为UserControl创建另一个构造函数。这是我现在得到的,它正在发挥作用:

public ObservableCollection<ComboBoxInfo> Items { get; private set; }

public CustomComboBox()
{
    InitializeComponent();
    Items = new ObservableCollection<ComboBoxInfo>();
    cmb.ItemsSource = Items;

    if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
    {
        this.createNameComboBox(); // ObservatoryCollection populating       
    }           
}

我尝试实现第二个构造函数并在主窗口中移动集合填充函数但是我收到一条错误,指出UserControl中的comboBox未设置为对象的实例。理想情况下,我想要这样的事情:

public CustomComboBox(ObservableCollection<ComboBoxInfo> Items)
{
    this.Items = Items
    // Not sure if the binding should be done here or in default constructor
}

知道如何正确地做到这一点?感谢

1 个答案:

答案 0 :(得分:1)

您的解决方案应包含ViewModel,该DataContext将设置为您的用户控件的example

这个ViewModel应该包含并公开ObservableCollection作为公共属性,理想情况下它应该使用一些注入的服务提供者从某些数据存储中获取数据并使用该数据填充ObservableCollection。最后,来自用户控件的ComboBox应该绑定到ViewModel中的ObservableCollection。

您的用户控件代码隐藏应该没有除某些事件处理程序之外的代码,以便在必要时操纵UI以响应UI事件...

这就是使用MVVM模式在WPF中正确完成的事情。

以下是{{3}}如何将服务注入VM构造函数并用于使用某些数据填充集合:

public class MainWindowViewModel
{
    private ICustomerService _customerService;

    public MainWindowViewModel(ICustomerService customerService)
    {
        _customerService = customerService;
        Customers = new ListCollectionView(customerService.Customers);
    }

    public ICollectionView Customers { get; private set; }
}