作为类比,我们在ComboBox中有两个Men先生:
快乐先生 格兰皮先生
我的ViewModel上有一个属性(在一定程度上使用MVVM,后面的代码中有一个SelectionChanged事件),我称之为IsGrumpy,如果Man先生很高兴,那么默认为false,如果Man先生是脾气暴躁。很明显!
现在,Happy先生可能有一个沉重的夜晚,在这种情况下,用户可以将IsGrumpy(一个CheckBox)设置为true,并将值保持为Xml。
当应用程序重新加载时,IsGrumpy属性设置正确,但是当视图加载时(并且Happy从加载中加载),SelectionChanged被触发,而Happy先生不再脾气暴躁!
他们是否有任何模式或技巧(不使用旗帜黑客)可以帮助我保持快乐脾气暴躁的先生!?
答案 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的选择变化。
然后您将拥有
的dataModelpublic 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中的设置,但这取决于您。