2015-06-05 4 views
2

У меня только что наткнулся на проблему, которую я не смог решить сам. Поэтому, надеюсь, кто-нибудь может дать мне некоторые идеи.WPF MessageBox Cancel checkbox check

Моя проблема:

Так у меня есть флажок, который имеет привязку к переменной класса:

//WPF 
<CheckBox IsChecked="{Binding IsChecked}" Name="cb" /> 

//class 
public class Mod 
{ 
    bool _IsChecked; 
    public bool IsChecked { get { return _IsChecked; } set { MainWindow.w.checkChanged(this, value); _IsChecked = value; } } 
} 

Теперь то, что я стремлюсь к это когда я нажимаю любой из флажков его будет выполнять метод. Этот метод будет проверять разные вещи и, в конце концов, если проверки не будут выполнены MessageBox будет отображаться с помощью кнопок OK и Отмена.

Когда пользователь нажимает Отмена, я хочу отменить проверку флажка, используя мое привязку к объекту.

mod.IsChecked = value; 

Однако, поскольку интерфейс не закончен до того, как MessageBox показывает вверх, он закончит пользовательский интерфейс проверьте контроллер после MessageBox были закрыты (я предполагаю, что после того, как он проверяет Binding).

Check boxes have been clicked

тумблер флажок только щелкнули (первый из 3), но поток пользовательского интерфейса на паузу, потому что он ждет на InvokeEnd в MessageBox.


Надеюсь, я сделал свою проблему достаточно ясной. Я не специалист в потоковом режиме, особенно не с WPF/Form. Поэтому, надеюсь, кто-то может помочь мне в правильном направлении.

Очень ценивший, Nkmol

ответ

1

Если я понимаю это право, моя первая мысль была бы вызвать метод из сеттер флажка в собственности (в ViewModel). Оттуда вы должны иметь старое значение, а также новое значение флажков и полный контроль над тем, что вы хотите сделать (всплывающее окно сообщения в этом случае). Существует несколько способов сделать это (here's one way).

Сторона заметок; то, как вы «привязываете данные», кажется мне «другим». Почему бы не реализовать INotifyPropertyChanged и NotifyPropertyChanged в настройке флажков? То, как вы делаете это сейчас, похоже, нарушает MVVM. Надеюсь, это помогло и удачи!

+1

Это помогло мне заняться довольно долгое время, когда я узнал всю концепцию MVVM, поэтому спасибо, что указали это. Как я исправил это сейчас: я добавил 'INotifyPropertyChanged' в логическое значение, и я добавил событие PropertyChanged в ListViewItem. Из-за этого я могу просто установить 'mod.IsChecked' в false и добавить флаг' _skipNextChange', чтобы он снова не активировал PropertyChanged. – nkmol

+0

Прохладный! Рад помочь! – Paul

Смежные вопросы