获取WPF控件以触发并设置另一个控件';s项目源
本文关键字:控件 项目 另一个 设置 WPF 获取 | 更新日期: 2023-09-27 18:30:00
我正在开发一个WPF应用程序,我想在其中展示一个具有两个选项的组合框。根据第一个组合框中的选择,第二个组合框的ItemsSource应更改为显示第一个组合盒中所选类型的项目。
然而,我的方法遇到了一些循环问题。我是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>
此代码给出错误"无法在Style Setter上设置TargetName属性"。我认为这是因为样式中没有可用的DataContext。然而,当我从代码中删除Style元素时,我最终会出现更多的错误。它似乎无法识别属性"Text"answers"ItemsSource",给出错误"在类型"ContentPresenter"上找不到静态成员"TextProperty"。"在internet上查找此错误的答案,我找到的唯一答案是将触发器放入样式中。。。
我在这里做错了什么?
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>
@David这可以使用TargetedTriggerAction实现。但你必须在后面写一些代码。在MVVM中使用TargetedTriggerAction是可以接受的。http://www.codeproject.com/Tips/401707/Behavior-and-Trigger-in-WPF-Silverlight