Привязка выбранного элемента WPF ComboBox - PullRequest
1 голос
/ 23 августа 2011

У меня есть WPF ComboBox и я использую MVVM для привязки свойств ItemsSource и SelectedItem.В основном, что я хочу сделать, это когда пользователь выбирает определенный элемент в комбинированном ящике, вместо этого комбинированный ящик выбирает другой элемент.

<ComboBox ItemsSource="{Binding TestComboItemsSource}" SelectedItem="{Binding TestComboItemsSourceSelected}"></ComboBox>

В демонстрационных целях у меня также есть кнопка для обновления SelectedItem.

<Button Command="{Binding DoStuffCommand}">Do stuff</Button>

У меня есть это в моей viewModel:

    public ObservableCollection<string> TestComboItemsSource { get; private set; }

    public MyConstructor()
    {
        TestComboItemsSource = new ObservableCollection<string>(new []{ "items", "all", "umbrella", "watch", "coat" });
    }

    private string _testComboItemsSourceSelected;
    public string TestComboItemsSourceSelected
    {
        get { return _testComboItemsSourceSelected; }
        set
        {
            if (value == "all")
            {
                TestComboItemsSourceSelected = "items";
                return;
            }

            _testComboItemsSourceSelected = value;
            PropertyChanged(this, new PropertyChangedEventArgs(TestComboItemsSourceSelected))
        }
    }

    private ICommand _doStuffCommand;

    public ICommand DoStuffCommand
    {
        get
        {
            return _doStuffCommand ?? (_doStuffCommand = new RelayCommand(p =>
                                                                              {
                                                                                  TestComboItemsSourceSelected = "items";
                                                                              })); }
    }

ОК, поэтому я хочу, чтобы ComboBox выбирал элемент "items" всякий раз, когда пользователь выбирает элемент "all".Используя кнопку, я могу обновить SelectedItem комбинированного списка, и я вижу это отраженным в пользовательском интерфейсе

У меня есть похожая логика для обновления viewModel в моем установщике свойства TestComboItemsSourceSelected.Если пользователь выбирает «все», вместо этого установите SelectedItem на «элементы». Таким образом, в коде свойство viewmodel изменяется, но это почему-то не отражается в пользовательском интерфейсе.Я что-то пропустил?Есть ли какой-то побочный эффект от того, как я это реализовал?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Поведение, которое вы описываете, кажется мне очень странным, но если вам нужна функция «Выбрать все», стандартный способ - создать комбинированный список, в котором элементы имеют флажок.

Каждый элемент представленнебольшой ViewModel (обычно со свойствами Id, Name и IsChecked), и вы вручную создаете «выбрать все элементы», который сначала добавляется в ObservableCollection, и подписываетесь на его PropertyChanged, чтобы установить для остальных свойств IsChecked элементов значение true.

1 голос
/ 23 августа 2011

Ну, это потому, что вы меняете свойство во время другого изменения.WPF не будет прослушивать событие PropertyChanged для этого свойства при его установке.

Чтобы обойти это, вы можете «запланировать» новое изменение с помощью диспетчера, поэтому оно будет выполнено после того, как оно выполнено с помощьютекущее изменение:

public string TestComboItemsSourceSelected
{
    get { return _testComboItemsSourceSelected; }
    set
    {
        if (value == "all")
        {
            Application.Current.Dispatcher.BeginInvoke(new Action(() => {
               TestComboItemsSourceSelected = "items";
            }));
            return;
        }

        _testComboItemsSourceSelected = value;
        PropertyChanged(this, new PropertyChangedEventArgs(TestComboItemsSourceSelected))
    }
}
...