获取WPF控件以触发并设置另一个控件的itemssource

时间:2014-11-10 09:57:42

标签: c# wpf xaml mvvm triggers

我正在开发一个WPF应用程序,我想在这里展示一个有两个选项的ComboBox。根据第一个ComboBox中的选择,第二个ComboBox的ItemsSource应该更改为显示在第一个ComboBox中选择的类型的项目。

然而,我的方法遇到了一些循环问题。我是WPF和MVVM的新手,所以也许我错过了一些明显的东西。我在互联网上找到的(很多)例子都不适用于我的情况。

我的XAML代码:

<ComboBox x:Name="cmbTargetType" SelectionChanged="cmbTargetType_SelectionChanged">
 <Style TargetType="ComboBox">
  <Style.Triggers>
   <Trigger Property="Text" Value="Materials">
    <Setter TargetName="cmbTarget" Property="ItemsSource" Value="{Binding DataContext.MaterialListViewModel.MaterialViewModels.AllMaterials, RelativeSource={RelativeSource AncestorType=Window}}"></Setter>
   </Trigger>
   <Trigger Property="Text" Value="ProductParts">
    <Setter TargetName="cmbTarget" Property="ItemsSource" Value="{Binding DataContext.ProductViewModel.ProductPartViewModels.AllProductParts, RelativeSource={RelativeSource AncestorType=Window}}"></Setter>
   </Trigger>
  </Style.Triggers>
 </Style>
 <ComboBoxItem Content="Material"/>
 <ComboBoxItem Content="ProductPart"/>
</ComboBox>

此代码给出了错误“无法在样式设置器上设置TargetName属性”。我假设是因为样式中没有可用的DataContext。但是,当我从代码中删除Style元素时,我最终会遇到更多错误。它似乎没有识别属性'Text'和'ItemsSource',在“ContentPresenter”类型上给出错误“找不到静态成员'TextProperty'。”在互联网上寻找这个错误的答案,我找到的唯一答案就是把触发器放在一个风格中......

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

无法在TargetName触发器中设置

Style。您可以绑定到其他ComboBox的属性,如下所示

<StackPanel>
  <ComboBox x:Name="cmbTargetType" SelectionChanged="cmbTargetType_SelectionChanged">
    <ComboBoxItem Content="Material"/>
    <ComboBoxItem Content="ProductPart"/>
  </ComboBox >
  <ComboBox x:Name="cmbTarget">
    <ComboBox.Style>
      <Style TargetType="{x:Type ComboBox}">
        <Style.Triggers>
          <DataTrigger Binding="{Binding Text, ElementName=cmbTargetType}"
              Value="Material">
            <Setter Property="ItemsSource"
                Value="{Binding 
                  DataContext.MaterialListViewModel.MaterialViewModels.AllMaterials, 
                  RelativeSource={RelativeSource AncestorType=Window}}" />
          </DataTrigger>
          <DataTrigger Binding="{Binding Text, ElementName=cmbTargetType}"
              Value="ProductPart">
            <Setter Property="ItemsSource"
                Value="{Binding 
                  DataContext.ProductViewModel.ProductPartViewModels.AllProductParts, 
                  RelativeSource={RelativeSource AncestorType=Window}}" />
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </ComboBox.Style>
  </ComboBox>
</StackPanel>

答案 1 :(得分:0)

@David这可以使用TargetedTriggerAction实现。但你必须写一些代码。在MVVM中使用TargetedTriggerAction是可接受的。 http://www.codeproject.com/Tips/401707/Behavior-and-Trigger-in-WPF-Silverlight