无法使用DataTrigger在Combobox中设置SelectedValue

时间:2011-06-07 21:01:44

标签: c# wpf xaml combobox datatrigger

我有一个comboBox,它有一个datatrigger,根据VM中的.NET属性值设置其SelectedIndex。我的问题是我无法让setter设置选定的索引。

ItemSource基于枚举数组。 Window的DataContext是具有Modulation和Bandwidth属性的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:

   <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}"/>

以下是我的VM中的.Net属性:

    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
    }

1 个答案:

答案 0 :(得分:0)

更改您的ComboBox绑定以使用SelectedValue而不是SelectedPath。这将在值更改时正确设置IFBandwidth视图模型属性。

触发器究竟用于什么?将Modulation属性更改为此类可能是更好的选择......

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

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