Невозможно установить SelectedValue в Combobox с помощью DataTrigger - PullRequest
0 голосов
/ 08 июня 2011

У меня есть comboBox, в котором есть источник данных, который устанавливает свой SelectedIndex на основе значения свойства .NET, установленного в виртуальной машине.Моя проблема в том, что я не могу заставить установщик установить выбранный индекс.

ItemSource основан на массиве перечислений.DataContext of the Window - это виртуальная машина, которая имеет свойства Modulation и Bandwidth.

Я новичок в 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 в моей виртуальной машине:

    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 голосов
/ 08 июня 2011

Измените привязку ComboBox, чтобы использовать SelectedValue вместо SelectedPath.Это правильно установит свойство модели представления IFBandwidth при изменении значения.

Для чего именно будет использоваться триггер?Возможно, будет лучше изменить свойство Modulation на что-то вроде этого ...

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

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