如何区分加载时的SelectionChanged和用户选择?

时间:2010-09-24 08:09:42

标签: wpf mvvm

作为类比,我们在ComboBox中有两个Men先生:

快乐先生 格兰皮先生

我的ViewModel上有一个属性(在一定程度上使用MVVM,后面的代码中有一个SelectionChanged事件),我称之为IsGrumpy,如果Man先生很高兴,那么默认为false,如果Man先生是脾气暴躁。很明显!

现在,Happy先生可能有一个沉重的夜晚,在这种情况下,用户可以将IsGrumpy(一个CheckBox)设置为true,并将值保持为Xml。

当应用程序重新加载时,IsGrumpy属性设置正确,但是当视图加载时(并且Happy从加载中加载),SelectionChanged被触发,而Happy先生不再脾气暴躁!

他们是否有任何模式或技巧(不使用旗帜黑客)可以帮助我保持快乐脾气暴躁的先生!?

1 个答案:

答案 0 :(得分:0)

我不完全确定您在此处使用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类进行了实例化和初始化。

考虑到这一点,您可能希望覆盖MrMan数据模型中的IsGrumpy属性设置,而不是ViewModel中的设置,但这取决于您。