2

ItemsSourceプロパティが変更されたときにデフォルトの選択値を設定しようとしていますComboBox

私のxaml:

<ComboBox ItemsSource="{Binding SelectedItemsSource, Mode=OneWay}" x:Name="c1">
   <i:Interaction.Triggers>
         <ei:PropertyChangedTrigger Binding="{Binding ItemsSource,RelativeSource={RelativeSource Self}}">
              <ei:ChangePropertyAction PropertyName="SelectedIndex" Value="{StaticResource zero}" TargetName="c1"/>
         </ei:PropertyChangedTrigger>                        
   </i:Interaction.Triggers>             
</ComboBox>

VMのSelectedItemsSourceは動的に変更されるため、これが発生するたびに最初のアイテムを選択する必要があります。

なぜこれが機能しないのか考えてみてください。

4

3 に答える 3

3

コンボボックスのプロパティIsSynchronizedWithCurrentItemを設定trueして、トリガーを完全に削除してみてください-

<ComboBox ItemsSource="{Binding SelectedItemsSource, Mode=OneWay}"
          IsSynchronizedWithCurrentItem="True">             
</ComboBox>
于 2012-09-09T08:49:40.363 に答える
3

私の解決策に向かう途中の現在の回答に加えて、私が実際に達成する必要があるのは、itemsSources(複数形)を切り替えるときに最後に選択されたアイテムを取得することです

私が見つけた記事から: 「ItemsSourceバインディングごとに、一意のCollectionViewが生成されます。」

ビューが存在する限り、各バインディングは独自のCollectionViewを生成するため、で装飾されている場合はCurrentItemとCurrentPositionへの参照を保持することに同意しました。

IsSynchronizedWithCurrentItem = "True"

だから私は自分のChangePropertyActionクラスを作成しました:

 public class RetriveLastSelectedIndexChangePropertyAction : ChangePropertyAction
 {                
    public int LastSelectedIndex
    {
        get { return (int)GetValue(LastSelectedIndexProperty); }
        set { SetValue(LastSelectedIndexProperty, value); }
    }

    public static readonly DependencyProperty LastSelectedIndexProperty =
        DependencyProperty.Register("LastSelectedIndex", typeof(int), typeof(RetriveLastSelectedIndexChangePropertyAction), new UIPropertyMetadata(-1));

    protected override void Invoke(object parameter)
    {
        var comboBox = this.AssociatedObject as ComboBox;
        this.SetValue(LastSelectedIndexProperty, comboBox.Items.CurrentPosition);            
    }        
 }

次のようにPropertyChangedTriggerを使用して呼び出しました 。

 <ComboBox ItemsSource="{Binding SelectedItemsSource, Mode=OneWay}" 
           x:Name="c1" 
           IsSynchronizedWithCurrentItem="True">                                    
       <i:Interaction.Triggers>
          <ei:PropertyChangedTrigger Binding="{Binding ElementName=c1,Path=ItemsSource}">
              <local:RetriveLastSelectedIndexChangePropertyAction                   
                      PropertyName="SelectedIndex" 
                      Value="{Binding LastSelectedIndex}" 
                      TargetName="c1"/>
          </ei:PropertyChangedTrigger>                        
       </i:Interaction.Triggers>
  </ComboBox>            

DataContextに厄介なコードがなくても、最後に選択したアイテムを取得する必要がある場合に、これが役立つことを願っています。お楽しみください。

于 2012-09-09T18:18:34.720 に答える
1

バインディングを次の場所から変更してみてください。

<ei:PropertyChangedTrigger Binding="{Binding ItemsSource,RelativeSource={RelativeSource Self}}">

<ei:PropertyChangedTrigger Binding="{Binding ItemsSource,ElementName=c1}">
于 2012-09-09T08:15:36.230 に答える