2011-09-08 39 views
2

我想要一个wpf表单上的10个组合框的数组。XAML组合框的静态数量的控制数组

组合框的ItemsSource是相同的 - 可选项的ObservableCollection。

每个选定的项目将绑定到一个项目在不同的ObservableCollection,想象力称为“SelectedItems” ..

什么是做数组的最佳方式?我当然可以有10个独立的组合框,但这不会是非常优雅..

我不认为一个ItemsControl模板是我后,因为组合框的数量是静态的。

感谢

回答

3

如果我理解你的权利,你有10个组合框使用相同的项目列表,但不同的数据源

在这种情况下,我能为这台共同属性,如ItemsSource ComboBox中创建一个共同的风格(和SelectedItem如果绑定对于所有项都是相同的),然后根据需要实际在表单上创建单独的ComboBoxes。

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type ComboBox}"> 
      <!-- Set the binding to wherever your ItemsSource resides. In this 
       case,I'm binding to a static class called Lists and a static 
       property called ComboBoxItems --> 
      <Setter Property="ItemsSource" 
        Value="{Binding Source={x:Static local:Lists.ComboBoxItems}}" /> 

      <!-- Only use this setter if your binding is the same everywhere --> 
      <Setter Property="SelectedItem" Value="{Binding SelectedItem}" /> 
     </Style> 
    </StackPanel.Resources> 

    <ComboBox DataContext="{Binding Item1}" /> 
    <ComboBox DataContext="{Binding Item2}" /> 
    <ComboBox DataContext="{Binding Item3}" /> 
    <ComboBox DataContext="{Binding Item4}" /> 
    <ComboBox DataContext="{Binding Item5}" /> 
    <ComboBox DataContext="{Binding Item6}" /> 
    <ComboBox DataContext="{Binding Item7}" /> 
    <ComboBox DataContext="{Binding Item8}" /> 
    <ComboBox DataContext="{Binding Item9}" /> 
    <ComboBox DataContext="{Binding Item10}" /> 
</StackPanel> 

当然,如果您的组合框的数据源可以在集合中说,最好是他们和您使用ItemsControl显示组合框

<ItemsControl ItemsSource="{Binding SelectedItems}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ComboBox SelectedItem="{Binding }" 
         ItemsSource="{Binding Source={x:Static local:Lists.ComboBoxItems}}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

谢谢雷切尔 - '如果我理解你的权利,你有10个组合框与相同的项目列表,但不同的数据源' - 是的每个组合框将绑定到'SelectedItems'ObservableCollection中的单独项目,但'如果组合框的DataSource可以放入集合'的答案也是是的..抱歉的混乱 - 所以你会推荐ItemsControl? –

+0

@ Joe.Net是的,我肯定会在你的情况下推荐一个'ItemsControl'。根据您在原始问题中所说的内容,您可以将ItemsControl.ItemCollection绑定到SelectedItems,并在ComboBox上设置ComboBox的SelectedItem =“{Binding}”,以将选定的项目绑定到集合。由于您使用的是ItemTemplate,因此您无需为ComboBox创建单独的样式 – Rachel

+0

非常好,谢谢Rachel –

2

每个选定的项目将绑定到一个项目在不同的ObservableCollection,想象力称为 'SelectedItems' ..

鉴于你有效结合一个集合,我会做一个ItemsControl模板,然后就这样对待它。除非你想自定义布局(即:这些不会一起安排在视图中),即使项目的数量总是“静态”,也可以简化设计。

如果您希望将这些项目单独排列在视图上,那么只需有10个组合框可能更合适。

+0

感谢里德。'鉴于你有效地绑定到一个集合,我会做一个ItemsControl模板' - 每个组合框在开始时都是空的 - 只有当一个项目被选中时,这将被添加到ObservableCollection - 你的建议仍然是与ItemsControl? (我正在考虑将组合框放到面板中,因此它们被命令(可以这么说)) –

+0

@ Joe.Net:是的 - 尽管“启动时为空”可能需要在启动时为“null” - 与在选择时适当地设置一个值。 OC 可能需要初始化10个空值...但是,是的,这是我如何处理它。 –

-1

不知道为什么你需要这个......这可能是决定如何做到这一点很重要......这是我的刺伤。

为什么不设计UI,为每个ComboBox命名,创建一个List并在运行时将它们添加到List中?

+0

yuck - 如果你想添加/删除组合框,或者改变他们的风格,或者... – ColinE

+0

yuck - 这不是非常容易维护,但它确切地是原始的海报要求...如果他想要的东西可维护的,我们都能够做到这一点。不过,我认为它不值得赞扬。 – djdanlib

2

我个人认为,一个ItemsControl它有一个ItemTemplate其构造,每个ComboBox要走的路!你总是会准确地拥有其中的10个吗?

从MVVM的角度来看,我可以想象一个拥有选择视图模型集合的父视图模型。每个选择视图模型将包含可以选择的项目列表以及当前选定的项目。这个视图模型很容易绑定到你的视图。

+0

感谢科林 - 是的10 - 但这将改变未来 - 但我想要一个简单和优雅的方式来改变它 - 因此我的控制阵列思考.. –