2

ItemsSource当我的属性发生变化时,我正在尝试设置默认选择值ComboBox

我的xml:

<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

除了引导我找到解决方案的当前答案之外,我实际需要完成的是在 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 回答
3

尝试为您的组合框设置属性IsSynchronizedWithCurrentItemtrue并完全删除触发器 -

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

尝试从以下位置更改您的绑定:

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

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