2013-05-25 68 views
1

這應該是簡單的,但我不能找到它: 我有兩個是通過主從相關組合框綁定:如何將ComboBox的SelectedIndex設置爲零,只要其ItemsSource更改?

<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> 

但這隻能在第一時間,而不是之後我做的第一個組合框中一個新的選擇。

怎麼辦?

回答

2

您可以通過使用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" 
+0

對不起,這不起作用。我得到各種錯誤消息,'我'命名空間沒有這個或那個。此外,代碼依賴於主組合框的硬編碼參考,這違背了使用可重用樣式的目的。 – Dabblernl

+0

+1,我總是忘記交互性,發佈不同的解決方案,因爲我喜歡拼圖:) –

+0

Dabblernl,爲了使它工作,你必須添加兩個引用'Microsoft.Expression.Interactions'和'System.Windows.Interactivity' – Rafal

2

老實說,要做到這一點是在視圖模型的最佳/最簡單的方法,當一個變化,翻轉的SelectedIndex期望的屬性(另一個的selectedInex)綁定將完成其餘的。 不需要樣式,觸發器和整個混亂。但爲了好玩,這只是一個quick'n'骯髒的,所以張貼整個/最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"; 
    } 

在我的代碼

背後創建視圖模型的所有屬性列表1,列表2,SelectedItemList1等。因此綁定會工作。讓我知道如果你需要ViewModel代碼(省略它,如同明顯..)

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     ViewModel = new ViewModel(); 
     InitializeComponent(); 
    } 
+0

I欣賞你爲此付出的工作量。它證明了在視圖模型或後面的代碼中實現這種行爲(可重複的)要容易得多。仍然:爲什麼沒有簡單的'ItemsSourceChanged' RoutedEvent,我可以做一個觸發器? – Dabblernl

相關問題