WPF:如何正确使用MVVM模式

时间:2013-12-30 19:47:44

标签: wpf xaml mvvm

这是一个可以轻松解决的问题。 我的问题是,如果我想坚持使用MVVM模式,如何解决它正确

模型(M)很简单:
它分析机器的音频系统(单声道或立体声) 将此数据传递给VM
传递到所有(左/右或单声道)通道的VM音量级 从用户

获取所选通道

所以,VM也很简单。它包含以下布尔属性:
IsMono - true 如果单声道系统 false 如果是立体声
IsLeft - 仅与立体声相关
此外,还有3个整数属性:RightLevel,LeftLevel和MonoLevel

V将如此(对于立体声):
enter image description here

现在,如果系统是单声道,则不应显示音频通道帧框,音频级框架框应显示单行,标记为“单声道”。电平表的来源是MonoLevel 逻辑似乎很简单,但我在哪里实现呢?我需要将框架框“音频通道”和其他控件的IsVisible绑定到“not IsMono”,将单声道电平表绑定到“IsMono”。我需要添加其他(简单)逻辑,例如正确的标签和图标。

我应该使用转换器作为我的主要工具吗?转换器是否被视为View(V)或VM的一部分?我应该(在XAML中)为Mono和Stereo创建一个单独的视图,只是让所选的一个可见吗?扩展VM是否包含IsStereo(这只是NOT IsMono)和其他冗余以简化XAML是一个好主意吗?

1 个答案:

答案 0 :(得分:1)

我会在ViewModel IsStereoIsMono上的属性上创建,因为ViewModel不应关心演示文稿,因此,一个布尔值报告其国家就够了。然后在视图中使用2个转换器(它们确实属于表示层)BooleanToVisibility由系统提供,而BooleanToVisiblityNot完全相反,创建一个应该不是问题。绑定将仅触发转换器将执行的一个属性:

<AudioLevelUserControl x:Name="Mono" Visibility="{Binding IsMono, Converter={StaticResource BoolToVis}"/>
<AudioLevelUserControl x:Name="Stereo" Visibility="{Binding IsMono, Converter={STaticResource BoolToVisNot}"/>

类似的逻辑适用于其他的东西:左,右等......

然而,ViewModel中的两个属性也不是“罪” - 只是造型/打字偏好。只需要确保对其中一个属性的更改会引发属性更改,即使是另一个属性也会更改,因此两个绑定都会重新查询state(),请求获取当前值的getter。

public bool IsMono
{
    get {return _isMono;}
    set
    {
        if (_isMono == value) return;
        _isMono = value;
        RaisePropertyChanged(()=> IsMono);
        RaisePropertyChanged(()=> IsStereo);
}
//then do the same thing for IsStereo property..

你的问题:

现在,如果系统是单声道,则不应显示音频通道帧框,音频级框架框应显示单行,标记为“单声道”。电平表的来源是MonoLevel。

这完全取决于您和您的用户。它与MVVVM无关。 UI设计有不同的思想流派。然而,越来越多的你看到普通的要点不是过度拥挤的UI与目前没有用的控件。如果您正在玩Mono,为什么要使用立体声选项?然而,如果你的用户已经习惯了两者兼顾 - 那么就把两者都放在一起,客户永远都是对的:)