C# WPF MVVM 组合框绑定

C# WPF MVVM ComboBox Binding

首先,我要做的是 "simple" 将 ComboBox 绑定到我的来源。

结构类似于:

public class Data
{
    public ObservableList<string> List {get;set;}
    public string Selected {get;set;}
}

另外,它实现了INotifyPropertyChanged接口。 我的问题是,我通过 XAML 找到了几个解决方案,不幸的是我不能用 XAML 做到这一点,因为我的 ComboBoxes 必须在运行时生成。

所以我的问题是,如何将我的 ComboBox 绑定到 Data.List,以及如何将所选项目(值?)绑定到 Data.Selected,这个应该是 TwoWay 所以我的数据 class 知道某些东西被选中了。请记住,这必须通过 C# 代码(不幸的是,XAML 不是一个选项)。

提前致谢。 :)

这很容易。假设 Data 具有属性而不是字段:

public class Data
{
    public Data()
    {
        List = new ObservableCollection<string>
        {
            "Apple", "Orange", "Lime"
        };
    }

    public ObservableCollection<string> List { get; private set; }
    public string Selected { get; set; }
}

你可以这样写:

var comboBox = new ComboBox
{
    DataContext = new Data()
};

comboBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding("List"));
comboBox.SetBinding(ComboBox.SelectedItemProperty, new Binding("Selected") 
{ 
    Mode = BindingMode.TwoWay
});

要将ComboBox添加到可视化树中,只需为容器调用适当的方法即可。例如,这将适用于任何 ContentControl(如 Window):

AddChild(comboBox);

how i can bind my combobox to Data.List, and also the selected item (value?)

创建包含组合框的自定义 复合 用户控件。将组合框的属性映射到在自定义控件上创建的两个依赖项属性,一个用于加载数据,另一个用于提供按需选择项的数据。任何管道需求都在代码隐藏中完成,最终提供了所有的魔力。

然后您可以 create/bind 根据需要在您正在处理的其他页面中的代码隐藏中动态地使用此控件。

听起来有点像 "recursive binding"。如果您的组合在容器控件中,则需要将容器绑定到单个组合模型的集合,因此 ItemsControl 中的每个视图都将绑定到单个组合模型。