问题出在显示多个组合框的表单上--每个组合框的内容都是一个整数范围。可以有多个组合框,每个组合框的整数范围可以不同,并且这些信息都不是事先知道的。
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。
*显示的窗体在绑定到字符串属性的组合框的左侧有一个文本块-此值将是字典的键。
我不知道如何在不打破常规的情况下做到这一点。我认为是某种设置组合框内容的命令,但我不知道如何获得命令所需的键。基于这种想法,我也可能大错特错。
发布于 2018-07-18 14:39:07
您可能应该有一个包含项目列表的视图模型,每个项目都有另一个用于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。
发布于 2018-07-19 10:56:02
我最终创建了一个字符串列表。
当绑定属性的Get()被调用时,有一个函数可以检索列表中的下一个列表并传递它。
这有点俗气,但也是最小的代码更改。
https://stackoverflow.com/questions/51404555
复制相似问题