Невозможно установить SelectedValue в Combobox с помощью DataTrigger

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

ItemSource основан на массиве перечислений. DataContext окна — это виртуальная машина со свойствами 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
    }

person Pat    schedule 07.06.2011    source источник
comment
Если вы не понимаете привязки, прочитайте это.   -  person H.B.    schedule 08.06.2011
comment
Вы получаете ошибки привязки в окне вывода VisualStudio?   -  person H.B.    schedule 08.06.2011
comment
Это просто дополнительная установка SelecteValuePath или использование вместо этого привязки SelectedItem? Нужен ли триггер? Вы должны иметь возможность просто установить IFBandwith в модели представления, и он установит выбранное значение в поле со списком.   -  person Jerod Houghtelling    schedule 08.06.2011
comment
@Jerod: больше похоже на ответ, чем на комментарий.   -  person H.B.    schedule 08.06.2011


Ответы (1)


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

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

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

        if( modulation == TMod.P25 )
        {
            IFBandwith = TBand.Wide;
        }
    }
 }
person Jerod Houghtelling    schedule 07.06.2011
comment
Я действительно изменил виртуальную машину, как вы предложили, и это сработало. Глупый вопрос, но я не вижу, где SelectedPath используется в ComboBox XAML. Я думаю, что я не должен понимать синтаксис привязки. - person Pat; 08.06.2011
comment
Извините, я имел в виду SelectedValuePath. Хотя, если подумать, я не думаю, что это решило бы вашу проблему. - person Jerod Houghtelling; 08.06.2011
comment
Думаю, я надеялся сделать все это в XAML. Вы понимаете, почему это не работает? Мне было интересно, нужен ли преобразователь из-за несовместимости типов?? Интересно, что я могу отключить поле со списком с помощью установщика, который устанавливает для свойства IsEnabled значение false, поэтому я знаю, что триггер работает. - person Pat; 08.06.2011
comment
Это определенно может быть проблема с конвертацией. Может потребоваться конвертер строки в целое число. Я не знаю полных требований к дизайну, но из того, что я вижу, это логика, управляемая данными, которая имеет смысл для виртуальной машины. Я лично использую триггеры только для управления внешним видом представления (видимость, цвет и т. д.), чтобы не изменять данные модели. - person Jerod Houghtelling; 08.06.2011