这是一个可以轻松解决的问题。 我的问题是,如果我想坚持使用MVVM模式,如何解决它正确。
模型(M)很简单:
它分析机器的音频系统(单声道或立体声)
将此数据传递给VM
传递到所有(左/右或单声道)通道的VM音量级
从用户
所以,VM也很简单。它包含以下布尔属性:
IsMono - true 如果单声道系统 false 如果是立体声
IsLeft - 仅与立体声相关
此外,还有3个整数属性:RightLevel,LeftLevel和MonoLevel
V将如此(对于立体声):
现在,如果系统是单声道,则不应显示音频通道帧框,音频级框架框应显示单行,标记为“单声道”。电平表的来源是MonoLevel 逻辑似乎很简单,但我在哪里实现呢?我需要将框架框“音频通道”和其他控件的IsVisible绑定到“not IsMono”,将单声道电平表绑定到“IsMono”。我需要添加其他(简单)逻辑,例如正确的标签和图标。
我应该使用转换器作为我的主要工具吗?转换器是否被视为View(V)或VM的一部分?我应该(在XAML中)为Mono和Stereo创建一个单独的视图,只是让所选的一个可见吗?扩展VM是否包含IsStereo(这只是NOT IsMono)和其他冗余以简化XAML是一个好主意吗?
答案 0 :(得分:1)
我会在ViewModel
IsStereo
或IsMono
上的属性上创建,因为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,为什么要使用立体声选项?然而,如果你的用户已经习惯了两者兼顾 - 那么就把两者都放在一起,客户永远都是对的:)