2011-06-07 18 views
0

我有一个comboBox,它有一个数据触发器,它根据VM中的.NET属性值设置其SelectedIndex。我的问题是我无法让setter设置Selected Index。无法使用DataTrigger在Combobox中设置SelectedValue

ItemSource基于枚举数组。 窗口的DataContext是具有调制和带宽属性的VM。

我是新来的WPF,所以我确定我不理解绑定正确,但我拉我的头发!感谢您的帮助提前。

这是样式。

<Style x:Key="BWCombBoxStyle" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
         Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
      </Trigger> 
      <DataTrigger 
       Binding="{Binding Modulation}" Value="P25"> 
       <Setter Property="SelectedIndex" Value="2"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

这里的组合框:

<ComboBox Name="bandwidth" 
      Height="Auto" Width="70" 
      Style="{StaticResource BWCombBoxStyle}" 
      ItemsSource="{Binding BandwidthOptions, Mode=OneWay, ValidatesOnDataErrors=true, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged}" 
      SelectedValue="{Binding IFBandwidth, Mode=TwoWay, ValidatesOnDataErrors=True, 
      NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}"/> 

以下是.NET属性在我的VM:

public TMod Modulation 
    { 
     get { return modulation_; } 
     set { modulation_ = value; NotifyPropertyChanged("Modulation"); } 
    } 

    public Channel.TBnd IFBandwidth 
    { 
     get { return chan_.IFBandwidth; } 
     set 
     { 
      chan_.IFBandwidth = value; 
      NotifyPropertyChanged("IFBandwidth"); 
     } 
    } 

    public Channel.TBnd[] BandwidthOptions 
    { 
     get 
     { 
      return (Channel.TBnd[])System.Enum.GetValues(typeof(Channel.TBnd)); 
     } 
    } 

这里是枚举:

public enum TMod 
    { 
     FM = 0, 
     AM = 1, 
     P25 = 2, 
     TRK = 3 
    } 

    public enum TBnd 
    { 
     Std = 0, 
     Nar = 1, 
     Wide = 2, 
     XWide = 3 
    } 
+0

如果你不明白绑定读** [this](http://msdn.microsoft.com/zh-cn/ -us /库/ ms752347.aspx)**。 – 2011-06-07 21:10:30

+0

您是否在VisualStudio的输出窗口中看到绑定错误? – 2011-06-07 21:26:24

+0

作为另外设置SelecteValuePath或使用SelectedItem绑定来代替?需要触发器吗?你应该能够在视图模型中设置IFBandwith,并且它将在组合框中设置选定的值。 – 2011-06-07 21:39:51

回答

0

更改组合框绑定使用SelectedValue而不是Selecte dPath。当值更改时,将正确设置IFBandwidth视图模型属性。

触发器到底会用什么?这可能是一个更好的选择,改变你的调制属性是这样的...

public TMod Modulation 
{ 
    get { return modulation_; } 
    set 
    { 
     modulation_ = value; 
     NotifyPropertyChanged("Modulation"); 

     if(modulation == TMod.P25) 
     { 
      IFBandwith = TBand.Wide; 
     } 
    } 
} 
+0

我真的改变了你的建议和工作的虚拟机。愚蠢的问题,但我看不到在ComboBox XAML中使用SelectedPath的位置。我想我不能理解绑定语法。 – Pat 2011-06-07 23:25:03

+0

对不起,我的意思是SelectedValuePath。虽然,第二个想法,我认为它不会解决你的问题。 – 2011-06-08 00:22:05

+0

我想我希望能够在XAML中做到这一切。你明白为什么它不起作用吗?我想知道是否因为类型不兼容而需要转换器?有趣的是,我可以用一个设置IsEnabled属性为false的setter禁用组合框,所以我知道触发器正在工作。 – Pat 2011-06-08 05:01:29

相关问题