WPF ComboBox MVVM странное поведение - PullRequest
2 голосов
/ 10 мая 2011

У меня странное поведение, когда я связываю и комбинирую со своей моделью просмотра.Поведение следующее: когда я изменяю выбранное значение комбо, я проверяю новое значение, и если это новое значение недопустимо, я сохраняю старое значение и отбрасываю новое, таким образом я не поднимаюInotifypropertychanged, но в любом случае вызывается метод получения из свойства, связанного с полем со списком, он возвращает старое значение, которое я хочу показать, но вместо этого поле со списком показывает новое значение, даже если выбранное значение поля со списком указано как старое и правильное значениеЯ проверил в режиме отладки.Я не знаю, как я могу решить эту проблему, потому что я никогда не видел такого поведения, любые предложения будут высоко оценены.

Это код XAML

<ComboBox Height="23" Name="cbxStatus" HorizontalAlignment="Left"
          ItemsSource="{Binding Path=Status, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
          SelectedItem="{Binding Path=SelectedStatus, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
          DisplayMemberPath="Value" Width="130" VerticalAlignment="Center"
          IsEnabled="{Binding Path=StatusEnable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

этокод модели представления, свойство

public Config SelectedStatus
{
    get
    {
        if (ApplicationAction == ApplicationAction.Add)
        {
            base.Object.State = configManager.BudgetInitStatus();
            StatusEnable = false;
        }
        else
        {
            StatusEnable = true;
        }
        return base.Object.State;
    }
    set
    {
        if (base.Service.CanChangeBudgetStatus(base.Object, value))
        {
            base.Object.State = value;
            base.Object.IsDirty = true;
        }
        RaiseOnPropertyChanged("SelectedStatus");
        RaiseOnPropertyChanged("AssociateOrderButtonVisibility");
    }
}

Спасибо за помощь

Ответы [ 3 ]

4 голосов
/ 10 мая 2011

Как указано в моем комментарии к Джею, проблема здесь в том, что WPF устанавливает значение, а не прослушивает ваше уведомление об изменении (которое, в конце концов, он ожидает). Вам нужно поднять уведомление об изменении свойства вне контекста текущего сообщения. Вы можете сделать это с помощью диспетчера, например:

set
{
    if (!valid)
    {
        // value is unchanged
        Dispatcher.BeginInvoke(delegate { this.OnPropertyChanged(...) });
        return;
    }

    // value is changed here
}

Это обеспечит выполнение текущего сообщения привязки данных, а затем отдельное сообщение сообщает WPF, что «фактически значение, которое вы только что предоставили моему установщику, больше не является текущим значением».

Вы также можете использовать SynchronizationContext, если хотите. В любом случае, я признаю, что это немного глупо. К сожалению, я не знаю хорошего способа обойти это. Дело в том, что WPF предполагает, что значение, которое он передает вашему установщику, является эффективным значением свойства. Никакое количество уведомлений об изменении свойства в контексте операции привязки не убедит его в обратном.

2 голосов
/ 11 мая 2011

Установка привязки на

IsAsync=True

будет работать.

0 голосов
/ 10 мая 2011

Когда пользователь изменяет значение в комбинированном ящике, оно изменяется в комбинированном ящике, независимо от вашей модели просмотра.

Если вы измените это значение обратно и не вызовете уведомление об изменении свойства, ваша модель просмотра и представлениебудет не синхронизирован.

Короче говоря, когда вы отклоняете выбранное значение, вам все равно требуется уведомление об изменении свойства.

...