Как отличить SelectionChanged от нагрузки и от выбора пользователя? - PullRequest
1 голос
/ 24 сентября 2010

Как аналогия, у нас есть два Мистера Мена в ComboBox:

Мистер Хэппи Мистер Грампи

У меня есть свойство в моей ViewModel (в некоторой степени использующее MVVM ссобытие SelectionChanged в коде позади), которое я назвал IsGrumpy, которое по умолчанию равно false, если Мистер Мэн счастлив и истинен, если Мистер Мэн раздражительный.Очевидно!

Теперь у мистера Хэппи может быть тяжелая ночь, и в этом случае пользователь может установить IsGrumpy (CheckBox) в значение true, а значение сохраняется в Xml.

Когда приложение перезагружается, свойство IsGrumpy установлено правильно, но когда представление загружается (и Mr Happy загружается из постоянства), SelectionChanged запускается, а Mr Happy больше не раздражает!

Это какие-то шаблоны или приемы (без использования флагахаки) это может помочь мне в моем стремлении держать мистера Хэппи сварливым!?

1 Ответ

0 голосов
/ 24 сентября 2010

Я не совсем уверен, почему вы используете событие SelectionChanged здесь.Вам нужно только работать с измененным свойством элемента, выбранным в выпадающем списке, и это легко сделать с помощью привязки.

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

В вашей ViewModel все, что вам нужно, это следующее:

private MrMan fieldMrMan;/// best to ensure that this is instanciated.
private List<MrMan> fieldMrMen;/// best to ensure that this is instanciated.
public bool IsGrumpy
{
  get{return this.fieldMrMan.IsGrumpy;}
  set 
  {
     if(this.fieldMrMan.Name!="MrGrumpy")
       this.fieldMrMan.IsGrumpy=value;
  }
public MrMan MrManSelected
{
  get{return this.fieldMrMan;}
  set
  {
    if(value == this.fieldMrMan)
       return;
        ///Raise property change event here
      }
  }

public List<MrMan> MrMen
{
  get{return fieldMrMen;}
}

Затем, по вашему мнению,

<ComboBox x:Name="mrmenName" ItemsSource="{Binding MrMen}" SelectedItem="{Binding MrManSelected}"/>

Это справляется с изменением выбора с MrHappy на MrGrumpy.

Тогда у вас будет dataModel для вашего

public class MrMan
{
   public MrMan(string name, bool grumpy)
   {
     this.Name = name;
     this.IsGrumpy = grumpy;
   }
   public string Name{get;set;}
   public bool IsGrumpy{get;set;}
}

Очевидно, что ваши классы MrMan уже созданы и инициализированыв любом случае с данными из некоторого репозитория.

Подумав об этом, вы можете переопределить настройку свойства IsGrumpy в модели данных MrMan, а не в ViewModel, но это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...