Как получить значение из ComboBox в ViewModel - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь зафиксировать значение выбранного элемента из ComboBox в моей ViewModel. Я получаю значение, но по какой-то причине, когда я делаю сравнение строк в операторе IF, чтобы определить, какой элемент был выбран, сравнение не работает.

Чего мне не хватает?

Это правильный способ захвата значения в ViewModel?

1008 * XAML * <ComboBox x:Name="comboBox" SelectedItem="{Binding SelectedItemInFilter, UpdateSourceTrigger=PropertyChanged}> <ComboBoxItem IsSelected="True">No Selection</ComboBoxItem> <ComboBoxItem>Car</ComboBoxItem> <ComboBoxItem>Truck</ComboBoxItem> </ComboBox> ViewModel

    public class MyViewModel : ViewModelBase{

            public string _selectedItemInFilter;
            public string SelectedItemInFilter
            {
                get { return _selectedItemInFilter; }
                set {
                    if (_selectedItemInFilter != value) {
                        _selectedItemInFilter = value;
                        ComboBoxChanged();
                        Console.WriteLine("SelectedItem: {0}", SelectedItemInFilter); // outputs the right item name
                        RaisePropertyChanged();
                    }
                }
            }

            private void ComboBoxChanged()
            {
                if (SelectedItemInFilter.ToString() == "Car") {
                    Console.WriteLine("Do something with car...");
                }
                else {
                    Console.WriteLine("Is not Car...");
                }
            }
    }

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы ошибаетесь, потому что элементы на самом деле не являются строками, если вам нужно сделать это так, вы можете сделать следующее:

public object _selectedItemInFilter;

    public object SelectedItemInFilter
    {
        get
        {
            return _selectedItemInFilter;
        }
        set
        {
            if (_selectedItemInFilter != value)
            {
                _selectedItemInFilter = value;
                ComboBoxChanged();
                Console.WriteLine("SelectedItem: {0}", SelectedItemInFilter); // outputs the right item name
                NotifyPropertyChanged("SelectedItemInFilter");
            }
        }
    }
    private void ComboBoxChanged()
    {
        if (((ComboBoxItem)SelectedItemInFilter).Content.ToString() == "Car")
        {
            Console.WriteLine("Do something with car...");
        }
        else
        {
            Console.WriteLine("Is not Car...");
        }
    }

Это не то же самое, что связать ObservableCollection, чем объявление элементов в элементе управления ComboBox.

0 голосов
/ 03 сентября 2018

Поскольку вы явно добавляете ComboBoxItems (вместо установки или привязки ItemsSource к коллекции строк), SelectedItem также является ComboBoxItem, а не строкой. Однако вы можете привязать строку Content выбранного элемента, используя SelectedValue и SelectedValuePath:

<ComboBox SelectedValue="{Binding SelectedItemInFilter}"
          SelectedValuePath="Content">
    <ComboBoxItem>No Selection</ComboBoxItem>
    <ComboBoxItem>Car</ComboBoxItem>
    <ComboBoxItem>Truck</ComboBoxItem>
</ComboBox>

Еще проще было бы вообще не использовать ComboBoxItems:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
...

<ComboBox SelectedItem="{Binding SelectedItemInFilter}">
    <sys:String>No Selection</sys:String>
    <sys:String>Car</sys:String>
    <sys:String>Truck</sys:String>
</ComboBox>
...