如何在组合框的选定索引在其项目源更改时将其设置为零?



这应该很简单,但我找不到它:我有两个通过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();
    }

相关内容

  • 没有找到相关文章

最新更新