MVVM将组合框内容绑定到字典中的列表

时间:2018-07-18 14:25:28

标签: c# wpf mvvm

问题在于显示多个组合框的表单-每个表单的内容都是整数范围。可以有多个组合框,并且每个组合框的整数范围可以不同,并且这些信息都不会提前知道。

XAML中这些组合框的数据模板是这个

<DataTemplate x:Key="ListComboboxTemplate">
        <ComboBox Margin="0,0,0,0" MinWidth="230" Height="22" ItemsSource="{Binding Path=DataContext.ListBoxContent, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                  ... >

ListBoxContent属性是字符串的ObservableCollection(我不知道为什么它是可观察的-内容一旦设置,就不会更改)。

当存在两个或两个以上具有整数范围的组合框且范围不同时,将显示此错误-加载它们的循环仅将其计算的列表分配给ListBoxContent属性;结果是所有组合框都具有相同的范围(当然,这是最后一个计算出的范围)。

我正在猜测我需要的ViewModel,而不是简单的列表,而是像字典那样的东西,键到一个字符串*,其值是字符串的ObservableCollection。

*显示的表单在组合框的左侧具有一个文本框,该文本框绑定到字符串属性-此值将是字典的键。

我对如何做到这一点不知所措。我认为某种命令可以设置组合框的内容,但我不知道如何获取该命令所需的密钥。我也可能偏离这个想法。

2 个答案:

答案 0 :(得分:0)

您可能应该有一个视图模型,其中包含一个项目列表,每个项目都有另一个ComboBox项目列表:

public class ListItem
{
    public IEnumerable<string> ComboBoxItems { get; set; }
}

public class ViewModel
{
    public ObservableCollection<ListItem> ListItems { get; } 
        = new ObservableCollection<ListItem>();
}

并使用ItemsControl对其进行可视化:

<ItemsControl ItemsSource="{Binding ListItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding ComboBoxItems}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

像这样初始化它:

public MainWindow()
{
    InitializeComponent();

    var vm = new ViewModel();
    vm.ListItems.Add(new ListItem { ComboBoxItems = new string[] { "1.1", "1.2" } });
    vm.ListItems.Add(new ListItem { ComboBoxItems = new string[] { "2.1", "2.2" } });

    DataContext = vm;
}

在ViewModel类中甚至没有必要具有ObservableCollection。

答案 1 :(得分:0)

我最终创建了一个字符串列表列表。

调用绑定属性的Get()时,那里有一个函数可以检索列表中的下一个列表并将其传递。

这有点俗气,但这也是最小的代码更改。