我正在开发一个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'。”在互联网上寻找这个错误的答案,我找到的唯一答案就是把触发器放在一个风格中......
我在这里做错了什么?
答案 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