每个类都有单独的MVVM命令

问题描述 投票:-1回答:1

我是一个MVVM模式的新手。经过长时间的上网查询,我从一个按钮的MVVM命令开始。为了更好的使用,我使用的是 MVVM Light NuGet包来写代码。有2个按钮,点击每个按钮我都会做一些事情(这里,点击按钮A会显示 "实现功能A")。下面这段代码可以正常工作。

namespace ButtonMVVM
{
    class CommandViewModel : ViewModelBase
    {
        public RelayCommand FeatureA { get; private set; }
        public RelayCommand FeatureB { get; private set; }

        public CommandViewModel()
        {
            this.FeatureA = new RelayCommand(this.FeatureAFunc);
            this.FeatureB = new RelayCommand(this.FeatureBFunc);
        }

        private void FeatureAFunc()
        {
            MessageBox.Show("Implement feature A");
        }

        private void FeatureBFunc()
        {
            MessageBox.Show("Implement feature B");
        }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

而且在xaml文件中。

<Window x:Class="ButtonMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ButtonMVVM"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.DataContext>
        <local:CommandViewModel/>
    </Window.DataContext>

    <Grid>
        <Button Command='{Binding FeatureA}' x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="54,81,0,0" VerticalAlignment="Top" Width="75"/>
        <Button Command='{Binding FeatureB}' x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="179,81,0,0" VerticalAlignment="Top" Width="75"/>

    </Grid>
</Window>

但是现在,想象一下我有很多功能(比如10个功能),有很多代码,每个功能有很多辅助方法。我不能把所有的方法都写在1个类里。CommandViewModel.

是否有办法将每个特征归入一个指定的类别(即 featureA.cs, featureB.cs...)?

c# xaml mvvm viewmodel mvvm-light
1个回答
2
投票

如果你只想有多个文件,你可以把你的 CommandViewModel 阶层 partial 并为该单类创建多个文件。然后,将每个功能放入相应的文件中。

CommandViewModel.cs:

partial class CommandViewModel : ViewModelBase
{
    public CommandViewModel()
    {
        this.FeatureA = new RelayCommand(this.FeatureAFunc);
        this.FeatureB = new RelayCommand(this.FeatureBFunc);
    }
}

CommandViewModel.FeatureA.cs:

partial class CommandViewModel
{
    public RelayCommand FeatureA { get; }

    private void FeatureAFunc()
    {
        MessageBox.Show("Implement feature A");
    }
}

CommandViewModel.FeatureB.cs。:

partial class CommandViewModel
{
    public RelayCommand FeatureB { get; }

    private void FeatureBFunc()
    {
        MessageBox.Show("Implement feature B");
    }
}

从技术上讲,这仍然是一个单一的类,但会被分割成多个文件。另一个缺点是,你将只有一个构造函数,所以你将不得不把所有特性的初始化逻辑放在一个文件中。这样做的好处是,你不需要接触你的XAML。

另一种变体:使用多个视图模型,为每个功能指定一个。

主视图模型.cs:

class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        this.FeatureA = new ViewModelFeatureA();
        this.FeatureB = new ViewModelFeatureB();
    }

    public ViewModelFeatureA FeatureA { get; }
    public ViewModelFeatureB FeatureB { get; }
}

ViewModelFeatureA.cs:

class ViewModelFeatureA : ViewModelBase
{
    public ViewModelFeatureA ()
    {
        this.FeatureACommand = new RelayCommand(this.FeatureAFunc);
    }

    public RelayCommand FeatureACommand { get; }

    private void FeatureAFunc()
    {
        MessageBox.Show("Implement feature A");
    }
}

这将让你把你的逻辑封装在不同的类和文件中。然而,你需要改变你的视图的绑定。

要么通过主视图模型的属性来访问视图模型。

<Button Command='{Binding FeatureA.FeatureACommand}'/>

或者改变相关视图部分的数据上下文。

<Grid DataContext="{Binding FeatureA}>
    <Button Command='{Binding FeatureACommand}'/>
</Grid>
© www.soinside.com 2019 - 2024. All rights reserved.