获取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上查找此错误的答案,我找到的唯一答案是将触发器放入样式中。。。

我在这里做错了什么?

获取WPF控件以触发并设置另一个控件';s项目源

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