c# – 在MVVM WPF应用程序中的视图模型之间传递应用程序状态

我需要编写一个小应用程序来读取配置文件并使用它生成一些报告.我希望最终能够使用MVVM,但开始使用起来相当棘手.哦,我正在使用Caliburn.Micro框架.

所以这就是我所拥有的一个shell(托管其他视图的主视图),它有一个带有3个按钮的功能区:

1)打开文件
2)显示设置
3)显示结果

还有另外两个视图,SettingsView和ResultsView带有按钮来生成和删除报告.

所以我猜视图结构将是这样的:

ShellView
   Ribbon
      OpenFileButton
      SettingsButton
      ResultsButton
   ContentControl (hosts SettingsView and ResultsView)

SettingsView
    CalculateResultsButton

ResultsView
    CancelResultsButton

棘手的部分是:

1. "Show settings" button is disabled until a file is opened (via Open file). 
2. "Show results" button is disabled until a report is calculated (via a 
    method in SettingsViewModel).
3. If a report is calculated, the CalculateResultsButton is disabled and
   CancelResultsButton is enabled and vice versa.

请告知我怎样才能做到这一点?我不知道应该采取什么策略.我的非MVVM思维大脑说我应该创建一个状态变量,然后以某种方式将这些按钮绑定到该变量,但我想这不会在MVVM世界中工作,对吧?任何代码示例将非常非常感谢!

非常感谢!

最佳答案
由于您使用的是CM,因此不需要任何代码隐藏.如果需要,可以删除.xaml.cs文件.

这是一个非常基本的例子,但它应该让你知道如何控制按钮的状态.在此示例中,将启用“打开”,并禁用其他两个.如果单击“打开”,则启用“设置”.单击“设置”后,“结果”也会出现相同的情况.

如果您需要一种方法来执行全局状态,可以通过将单例SharedViewModel注入ViewModel来应用相同的概念,并且CanXXX方法可以检查SharedViewModel中的值. This是不同东西的SL演示,但是一个是注入单例来共享数据,同样的想法适用于wpf.

ShellView:

<Window x:Class="CMWPFGuardSample.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0"
                    Orientation="Horizontal">
            <Button x:Name="Open"
                    Content="Open" />
            <Button x:Name="Settings"
                    Content="Settings" />
            <Button x:Name="Results"
                    Content="Results" />
        </StackPanel>
    </Grid>

</Window>

ShellViewModel:

 [Export(typeof (IShell))]
    public class ShellViewModel : PropertyChangedBase, IShell
    {
        private bool _isOpen;
        public bool IsOpen
        {
            get { return _isOpen; }
            set
            {
                _isOpen = value;
                NotifyOfPropertyChange(() => IsOpen);
                NotifyOfPropertyChange(() => CanSettings);
            }
        }

        private bool _isSettings;
        public bool IsSettings
        {
            get { return _isSettings; }
            set
            {
                _isSettings = value;
                NotifyOfPropertyChange(() => IsSettings);
                NotifyOfPropertyChange(() => CanResults);
            }
        }

        public bool IsResults { get; set; }

        public void Open()
        {
            IsOpen = true;
        }

        public bool CanSettings
        {
            get { return IsOpen; }
        }

        public void Settings()
        {
            IsSettings = true;
        }

        public bool CanResults
        {
            get { return IsSettings; }
        }

        public void Results()
        {
        }
    }

转载注明原文:c# – 在MVVM WPF应用程序中的视图模型之间传递应用程序状态 - 代码日志