我正在尝试使用MVVM跟踪WPF应用程序中的状态。我只是希望一次有一个活跃的州,但我现在这样做的方式似乎不可靠而且不是很干。
这是我的代码的抽象版本:
public class ApplicationStates
{
public void SetStateOne()
{
IsThisStateOne = true;
IsThisStateTwo = false;
IsThisStateThree = false;
}
public void SetStateTwo()
{
IsThisStateOne = false;
IsThisStateTwo = true;
IsThisStateThree = false;
}
public void SetStateThree()
{
IsThisStateOne = false;
IsThisStateTwo = false;
IsThisStateThree = true;
}
public bool IsThisStateOne { get; set; }
public bool IsThisStateTwo { get; set; }
public bool IsThisStateThree { get; set; }
}
我的计划是将视图的相应XAML对象绑定到布尔属性以维护视图的状态。我想继续拥有可以绑定到的对象,这些对象可以根据它们是设置为true还是false来进行操作。
任何关于使这更干燥的想法,还是有一种完全不同的,更好的方法来构建它?
编辑1
我希望我的XAML看起来像这样:
<Button Visibility="{Binding IsThisStateOne, Converter={StaticResource boolToVisibilityConverter}}"/>
<Button Visibility="{Binding IsThisStateTwo, Converter={StaticResource boolToVisibilityConverter}"/>
这样我可以根据状态得到我需要的东西。状态会根据ViewModel的变化而改变。
从概念上讲,由于存在两个以上的状态,我可以创建一个转换器来检查字符串转换器参数的名称(“IsThisStateOne”,“IsThisStateTwo”)对照枚举的字符串,但是它会回到魔术字符串并且我希望避免重复使用非类型安全的代码。
我理解直接对枚举进行数据绑定,我想我只是不明白如何更改枚举的状态(我可以有一个描述字符串,但我不认为我可以改变它。)
编辑2
删除了枚举。我真的不在乎是否涉及枚举,我只是认为它会使事情变得更加强烈。
我想我只是想知道这种要求是否有更好的,已建立的设计模式。
答案 0 :(得分:4)
由于在任何给定时间只能激活一个状态,我将按如下方式对其进行建模:
public enum AppState { StateOne, StateTwo, StateThree }
public class MyApplication
{
public AppState CurrentState { get; set; }
// helper properties for UI binding
public bool IsThisStateOne { get { return CurrentState == AppState.StateOne; }
public bool IsThisStateTwo { get { return CurrentState == AppState.StateTwo; }
public bool IsThisStateThree { get { return CurrentState == AppState.StateThree; }
}
这使重复保持最小,并且仍允许从XAML进行简单的布尔绑定。
如果您希望在状态更改后自动更新UI,则需要在PropertyChanged
的设置器中调用辅助属性上的CurrentState
。
答案 1 :(得分:3)
我会保留属性以简化绑定。但是让它们只读,并保留一个公共变量(枚举,字符串,整数,最简单):
public void SetState(int stateNum)
{
_state = stateNum;
}
private int _state = 1;
public bool IsThisStateOne { get { return _state == 1; } }
public bool IsThisStateTwo { get { return _state == 2; } }
public bool IsThisStateThree { get { return _state == 3; } }