这应该很简单,但我找不到它:我有两个通过Master-Detail绑定相关联的组合框:
<ComboBox Style="{StaticResource FixedSelectionCombo}"
ItemsSource="{Binding ElementName=ControlRoot, Path=Clubs}"
DisplayMemberPath="Name"
SelectedItem="{Binding ElementName=ControlRoot,Path=SelectedClub}">
</ComboBox>
<ComboBox Style="{StaticResource FixedSelectionCombo}"
ItemsSource="{Binding ElementName=ControlRoot, Path=SelectedClub.PlayerLists}"
DisplayMemberPath="Name"
SelectedItem="{Binding ElementName=ControlRoot, Path=SelectedPlayerList}">
</ComboBox>
当我在第一个组合框中选择一个项目时,第二个组合框将用适当的PlayerLists填充,但我想让它的第一个项目被自动选中。
这在后面的代码中很容易做到,但是我想通过一个可以放在ResourceDictionary中的Style来实现这一点。我试着:
<Style x:Key="FixedSelectionCombo" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="SelectedIndex" Value="0"/>
</Style>
但是这只在第一次有效,而不是在我在第一个组合框中创建一个新选择之后。
怎么做呢?
您可以使用Interaction.Triggers
:
<ComboBox Style="{StaticResource FixedSelectionCombo}"
ItemsSource="{Binding ElementName=ControlRoot, Path=Clubs}"
DisplayMemberPath="Name"
SelectedItem="{Binding ElementName=ControlRoot,Path=SelectedClub}"
Name="cbClubs">
</ComboBox>
<ComboBox Style="{StaticResource FixedSelectionCombo}"
ItemsSource="{Binding ElementName=ControlRoot, Path=SelectedClub.PlayerLists}"
DisplayMemberPath="Name"
SelectedItem="{Binding ElementName=ControlRoot, Path=SelectedPlayerList}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged" SourceName="cbClubs">
<ei:ChangePropertyAction PropertyName="SelectedIndex" Value="1"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
需要名称空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
老实说,最好/最简单的方法是在ViewModel中,当其中一个的SelectedIndex发生变化时,翻转所需的属性(另一个的selectedInex),绑定将完成其余的工作。不需要样式、触发器和其他乱七八糟的东西。但为了好玩,这只是一个快速的肮脏,所以张贴整个/大部分xaml,以便它可以复制/粘贴/运行…使用不同的属性名,因为我想先运行/测试它注意,转换器返回一个虚拟字符串,您可以在其上触发样式。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" x:Name="window" >
<Window.Resources>
<local:IndexConverter x:Key="indexConverter"/>
<Style x:Key="comboBox2Style">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedList1Item, Converter={StaticResource indexConverter}}"
Value="selectFirstIndexOnAnyPropertyChanged">
<Setter Property="ComboBox.SelectedIndex" Value="0"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel DataContext="{Binding ElementName=window, Path=ViewModel}">
<ComboBox ItemsSource="{Binding List1}" SelectedItem="{Binding SelectedList1Item}"/>
<ComboBox ItemsSource="{Binding List2}" SelectedItem="{Binding SelectedList2Item}"
Style="{StaticResource comboBox2Style}"/>
public class IndexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return "selectFirstIndexOnAnyPropertyChanged";
}
在我的代码后面创建了一个ViewModel与所有属性List1, List2, SelectedItemList1等。所以绑定可以工作。让我知道如果你需要ViewModel代码(省略它,很明显…)
public partial class MainWindow : Window
{
public MainWindow()
{
ViewModel = new ViewModel();
InitializeComponent();
}