将Combobox ItemsSource绑定到DataTemplate中的StaticResource?

时间:2014-03-17 15:58:44

标签: wpf vb.net xaml combobox datatemplate

我有一个combobox,我希望显示多个对象,并返回enum个值。根据外部数据在视图中生成combobox的随机数。 combobox按预期工作,但在我打开其中任何一个然后是另一个,然后是我第一次打开的那个,然后第一个中的项目无法访问。(项目仍然存在但是dropdown菜单为空)。

要明确我一步一步地把我的行动放在这里:

  1. 我打开ComboBox1。我可以看到所有物品。
  2. 我打开ComboBox2。我可以看到所有物品。
  3. 我尝试打开ComboBox1。下拉菜单中没有任何项目。
  4. 我打开ComboBox3。我可以看到所有物品。
  5. 所有项目都已从ComboBox1ComboBox2消失。
  6. 我猜这个问题是由ItemsSource的路径损坏造成的,但我无法弄清楚如何避免它。

    <DataTemplate x:Key="CustomizedComboBox">
    <StackPanel Width="70" Margin="0,0,12,0">
      <ComboBox 
          SelectedIndex="{Binding Path=Type, Mode=TwoWay, Converter={vm:SelectedItemConverter}}" 
          ItemsSource="{StaticResource IconsAndLabelsArray}" 
          MinHeight="50"/>
      </ComboBox>
    </StackPanel>
    

    IconsAndLabelsArray

    <x:Array x:Key="IconsAndLabelsArray" Type="{x:Type StackPanel}" >
        <StackPanel Orientation="Horizontal">
          <Image Height="42"
                 VerticalAlignment="Top"
                 Source="/ProjectName;image1.png"
                 Stretch="Uniform" />
          <Label VerticalAlignment="Center" Content="Image1 Label" />
        </StackPanel>
        <StackPanel Orientation="Horizontal">
          <Image Height="42"
                 VerticalAlignment="Top"
                 Source="/ProjectName;image2.png"
                 Stretch="Uniform" />
          <Label VerticalAlignment="Center" Content="Image2 Label" />
        </StackPanel>       
    

1 个答案:

答案 0 :(得分:0)

x:Shared="False"上设置IconsAndLabelsArray,以便为每个comboBox创建新资源,而不是使用之前的资源。

<x:Array x:Shared="False" x:Key="IconsAndLabelsArray"
         Type="{x:Type StackPanel}" >
  ....
</x:Array>

问题是在添加到另一个Visual父级之前必须断开Visual。这就是为什么组合框最后打开的原因总是赢了,因为资源是默认共享的。因此有一个问题。

将sharing设置为false将为每个comboBox提供新的资源实例。