Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM调用ViewModel属性内的服务可以吗?_C#_Wpf_Mvvm - Fatal编程技术网

C# 使用MVVM调用ViewModel属性内的服务可以吗?

C# 使用MVVM调用ViewModel属性内的服务可以吗?,c#,wpf,mvvm,C#,Wpf,Mvvm,我正试图找出如何正确设置我的c#MVVM WPF应用程序。我很难理解如何使用模型、视图和视图模型的各个部分。我试图让我的模特保持沉默。如何处理单个属性(如卷)?创建模型对一个属性没有意义 我正在从系统加载值。现在在视图模型中,我使用一个服务来获取和设置音量。我创建了一个属性,以便可以获取和设置调用该服务的属性。这似乎是一个不好的做法,但我想不出一个好办法来解决它 下面是我在viewmodel中使用的一个属性的示例,以便我可以绑定到视图中的卷 public float Volume { ge

我正试图找出如何正确设置我的c#MVVM WPF应用程序。我很难理解如何使用模型、视图和视图模型的各个部分。我试图让我的模特保持沉默。如何处理单个属性(如卷)?创建模型对一个属性没有意义

我正在从系统加载值。现在在视图模型中,我使用一个服务来获取和设置音量。我创建了一个属性,以便可以获取和设置调用该服务的属性。这似乎是一个不好的做法,但我想不出一个好办法来解决它

下面是我在viewmodel中使用的一个属性的示例,以便我可以绑定到视图中的卷

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触发长时间运行的模型操作,如服务交互。将视图模型的属性值直接委托给模型通常是可以的。您只是不希望视图直接与模型交互。