gpt4 book ai didi

WPF:如何正确使用 MVVM 模式

转载 作者:行者123 更新时间:2023-12-04 20:52:54 25 4
gpt4 key购买 nike

这是一个很容易解决的问题。我的问题是,如果我想遵守 MVVM 模式,如何正确解决它。

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

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

V 看起来像这样(对于立体声):
enter image description here

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

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

最佳答案

我会在 ViewModel 的属性上创建 IsStereoIsMono 因为 ViewModel 不应该关心演示文稿,因此,一个报告其状态的 bool 值就足够了。然后在 View 中使用 2 个转换器(它们确实属于表示层)BooleanToVisibility 由系统提供,以及 BooleanToVisiblityNot,这完全相反,创建一个不应该成为一个问题。绑定(bind)将仅在一个带有转换器的属性上触发:

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

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

然而,在 ViewModel 中同时拥有这两个属性也不是“罪过”——只是样式/键入首选项。只需确保对其中一个属性的更改会引发另一个属性的更改,因此两个绑定(bind)都会重新查询 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..

你的问题是:

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

这完全取决于您和您的用户。它与 MVVVM 无关。在 UI 设计上有不同的思想流派。然而,你会越来越多地看到,总的要点是不要用目前无用的控件使 UI 拥挤不堪。如果您正在播放单声道,为什么要使用立体声选项?然而,如果您的用户习惯于同时拥有两者 - 那么将两者都放在一起,客户永远是对的:)

关于WPF:如何正确使用 MVVM 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20846395/

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