【问题标题】:MVVM bind combobox contents to a list in a dictionaryMVVM 将组合框内容绑定到字典中的列表
【发布时间】:2018-07-18 14:25:28
【问题描述】:

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

XAML 中这些组合框的 DataTemplate 是这样的

<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(我不知道为什么它是可观察的 - 内容一旦设置就不会改变)。

当有 2 个或更多组合框的整数范围且范围不同时,就会出现该错误 - 加载它们的循环只是将其计算的列表分配给 ListBoxContent 属性;结果是所有组合框都以相同的范围结束(当然是最后一个计算的)。

我猜是在我需要的 ViewModel 中,而不是一个简单的列表,比如字典,键入一个字符串*,其值是字符串的 ObservableCollection。

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

我不知道如何在不破坏模式的情况下做到这一点。我会认为某种命令可以设置组合框的内容,但我不知道如何获取命令所需的密钥。我也可能偏离这个想法。

【问题讨论】:

  • 你可以做一个列表列表。或字典,但它是不可观察的。

标签: c# wpf mvvm


【解决方案1】:

您可能应该有一个视图模型,其中包含一个项目列表,每个项目都有另一个用于 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。

【讨论】:

  • 这打破了 MVVM 模式,我意识到我可能必须这样做。
  • 不,这不会破坏 MVVM。不知道你为什么这么认为。
  • 我想我明白你在说什么。我只能说它需要留在 ViewModel 类中,因为我无法重组那么多。你是对的 - 它不需要是一个可观察的集合
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多