gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:50:54 25 4
gpt4 key购买 nike

打个比方,我们在 ComboBox 中有两个 Mr Men:

快乐先生
脾气暴躁的先生

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

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

当应用程序重新加载时,IsGrumpy 属性设置正确,但是当 View 加载(并且从持久性加载快乐先生)时,SelectionChanged 被触发,快乐先生不再脾气暴躁!

它们是否有任何模式或技巧(不使用标志黑客)可以帮助我让快乐先生脾气暴躁!?

最佳答案

我不完全确定您为什么在这里使用 SelectionChanged 事件。
您只需要处理组合框选定项属性更改,这很容易通过绑定(bind)完成。

这是我的粗略想法,希望对您有所帮助。 (请注意,我只是在没有求助于 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 的选择变化。

然后,您将拥有一个数据模型
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 数据模型中而不是在 ViewModel 中覆盖 IsGrumpy 属性的设置,但这取决于您。

关于wpf - 如何区分加载时的 SelectionChanged 和用户选择时的 SelectionChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com