C# 使用MVVM调用ViewModel属性内的服务可以吗?
我正试图找出如何正确设置我的c#MVVM WPF应用程序。我很难理解如何使用模型、视图和视图模型的各个部分。我试图让我的模特保持沉默。如何处理单个属性(如卷)?创建模型对一个属性没有意义 我正在从系统加载值。现在在视图模型中,我使用一个服务来获取和设置音量。我创建了一个属性,以便可以获取和设置调用该服务的属性。这似乎是一个不好的做法,但我想不出一个好办法来解决它 下面是我在viewmodel中使用的一个属性的示例,以便我可以绑定到视图中的卷C# 使用MVVM调用ViewModel属性内的服务可以吗?,c#,wpf,mvvm,C#,Wpf,Mvvm,我正试图找出如何正确设置我的c#MVVM WPF应用程序。我很难理解如何使用模型、视图和视图模型的各个部分。我试图让我的模特保持沉默。如何处理单个属性(如卷)?创建模型对一个属性没有意义 我正在从系统加载值。现在在视图模型中,我使用一个服务来获取和设置音量。我创建了一个属性,以便可以获取和设置调用该服务的属性。这似乎是一个不好的做法,但我想不出一个好办法来解决它 下面是我在viewmodel中使用的一个属性的示例,以便我可以绑定到视图中的卷 public float Volume { ge
public float Volume
{
get { _volume = audio.GetMasterVolume(); return _volume; }
set { _volume = value; audio.SetMasterVolume(value); Changed("Volume"); }
}
如果我改为设置一个模型来保存Volume属性,它看起来更像是一个传递。我对此非常陌生,希望知道正确的方法。我认为这里没有问题,我想重写属性以跳过
\u volume
成员变量
public float Volume
{
get => audio.GetMasterVolume();
set =>
{
audio.SetMasterVolume(value);
Changed(nameof(Volume));
}
}
唯一可以争论的是反模式是内部调用方法的属性。因为大多数使用视图模型的开发人员都希望属性读取内部值,并且可能不知道读取或写入属性将与外部服务对话
如果你的应用程序允许这样的逻辑,你可以永久地监听音量的变化,并将该值带到一个成员变量(可能是我在上面的代码中消除的那个),然后返回属性getter。这只是我的观点,但我认为设置volume属性可以在外部执行任何操作,不需要在setter之外的任何地方进行处理
/* pseudo code */
ctor()
{
audio.VolumeChanged += VolumeChanged;
}
private void VolumeChanged(object sender, VolumeEventArgs args)
{
_volume = args.Volume;
}
public float Volume
{
get => _volume;
set =>
{
audio.SetMasterVolume(value); // should set _volume by the event again
Changed(nameof(Volume));
}
}
我不确定这个问题。您的示例对于视图模型来说是正确的。我想我只是想知道在属性getter setter中调用服务是否合适。“我试图让我的模型保持沉默。”“模型代表您的业务逻辑,即应用程序的核心。这是哑巴的反面。您编写一个应用程序来解决一个特定的问题,这是一个包括服务程序和数据持久性的模型。视图模型仅为视图准备或公开数据,并将处理后的数据发送回模型。视图向用户显示从视图模型读取的数据,并允许用户操作发送回视图模型的数据。您通常更喜欢使用ICommand触发长时间运行的模型操作,如服务交互。将视图模型的属性值直接委托给模型通常是可以的。您只是不希望视图直接与模型交互。