Как программно изменить ComboBox SelectedValue с помощью MVVM

У меня есть ComboBox с элементами A, B, C, D, E.

Как я могу изменить SelectedValue ComboBox после выбора пользователя, поэтому, если пользователь выбирает из элементов списка «A», SelectedValue будет «D» (как если бы он сам выбрал D).

Xaml:

<StackPanel Orientation="Horizontal">
    <TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Height="25" Width="100" />
    <ComboBox 
        IsDropDownOpen="{Binding IsDropDownOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        ItemsSource="{Binding OffsetValues}"
        SelectedValue="{Binding NodeCategory, Mode=TwoWay}" 

        Height="25" Width="100" IsHitTestVisible="False" Background="AliceBlue">
        <ComboBox.Resources>
            <sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">0</sys:Double>
        </ComboBox.Resources> 
    </ComboBox>
</StackPanel>

ViewModel:

class ViewModel : ViewModelBase
{

    private IList<string> offsetValues =  new List<string>() { "mV", "V" };
    public IList<string> OffsetValues
    {
        get
        {
            return offsetValues;
        }
        set
        {
            offsetValues = value;
        }
    }


    private bool isDropDownOpen;

    public bool IsDropDownOpen
    {
        get { return isDropDownOpen; }
        set
        {
            isDropDownOpen = value;
            OnPropertyChanged();
        }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        { 
            _name = value;
            OnPropertyChanged( "Name" );

            if( _name != "" )
            {
                isDropDownOpen = true;
                OnPropertyChanged( "IsDropDownOpen" );
            }

        }
    }

    private string _NodeCategory;
    public string NodeCategory
    {
        get
        {
            return _NodeCategory;
        }
        set
        {
            if( Convert.ToDouble( _name ) > 1000 )
            {
                _name = "1.0";

                OnPropertyChanged( "Name" );

                _NodeCategory = OffsetValues[1];

                OnPropertyChanged( "NodeCategory" );

            }
            else
            { 
                _NodeCategory = value;
                OnPropertyChanged( "NodeCategory" ); 
            } 
        }
    } 
}


public class ViewModelBase : INotifyPropertyChanged
{

    protected virtual void OnPropertyChanged( [CallerMemberName]string propertyName = null )
    {
        PropertyChanged.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
    }

    public event PropertyChangedEventHandler PropertyChanged;

}

Спасибо


person dov    schedule 13.11.2016    source источник


Ответы (1)


Добавить xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Чем вы можете вызывать команду, когда SelectedItemChanged например

    <ComboBox x:Name="NodeCategoriesCombobox">

<i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding UpdateNodeCategoryCommand}" CommandParameter="{Binding ElementName=NodeCategoriesCombobox, Path=SelectedValue}"/>
            </i:EventTrigger>
         </i:Interaction.Triggers>
</ComboBox>

Затем вы добавляете UpdateNodeCategoryCommand и обновляете свойство NodeCategory.

private RelayCommand<string> _updateNodeCategoryCommand ;
 public RelayCommand<string> UpdateNodeCategoryCommand { 
get { return _updateNodeCategoryCommand ?? (_updateNodeCategoryCommand = new RelayCommand<string>( nodeCategory => { NodeCategory=nodeCategory })); 
}
 }
person Miguel    schedule 13.11.2016
comment
Не могли бы вы добавить синтаксис UpdateNodeCategoryCommand, мне все еще сложно с этим. - person dov; 13.11.2016
comment
Я сейчас снаружи. Вы можете проверить это msdn.microsoft.com/en-us/magazine/dn237302. aspx есть команда с параметром - person Miguel; 13.11.2016
comment
Если вы используете библиотеку MVVM, она должна иметь реализацию ICommand. Если нет, вы можете использовать один из следующих stackoverflow.com/questions/5069783/. MvvmLight имеет RelayCommand private RelayCommand<string> _updateNodeCategoryCommand ; public RelayCommand<string> UpdateNodeCategoryCommand { get { return _updateNodeCategoryCommand ?? (_updateNodeCategoryCommand = new RelayCommand<string>( nodeCategory => { NodeCategory=nodeCategory })); } } - person Miguel; 13.11.2016