c# - 在 MVVM WPF 应用程序中的 View 模型之间传递应用程序状态

标签 c# wpf silverlight mvvm caliburn.micro

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

这就是我所拥有的,一个外壳(承载其他 View 的主视图),上面有一个带有 3 个按钮的功能区:

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

还有另外两个 View ,SettingsView 和 ResultsView,带有用于生成和删除报告的按钮。

所以我猜 View 结构应该是这样的:

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 思维大脑说我应该创建一个状态变量,然后以某种方式将这些按钮绑定(bind)到该变量,但我想这在 MVVM 世界中行不通,对吧?任何代码示例将非常非常非常感谢!

非常感谢!

最佳答案

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

这是一个非常基本的示例,但它应该能让您了解如何控制按钮的状态。在此示例中,Open 将被启用,而其他两个将被禁用。如果单击 Open,将启用 Settings。单击 Settings 后,Results 也会发生同样的情况。

如果您需要一种处理全局状态的方法,可以通过将单例 SharedViewModel 注入(inject) ViewModel 来应用相同的概念,并且 CanXXX 方法可以检查 SharedViewModel 中的值>。 This是不同事物的 SL 演示,但其中一个是注入(inject)单例来共享数据,同样的想法适用于 wpf。

外壳 View :

<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>

外壳 View 模型:

 [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 应用程序中的 View 模型之间传递应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015939/

相关文章:

c# - 将客户端 ID 传递给代码隐藏

wpf - 从 MVVM 绑定(bind)到 View 在 Prism 中不起作用

c# - 标签不会在 while 循环内更改值

c# - 列表框中的图像加载问题,WP7

silverlight - MVVM 灯 - 如何访问其他 View 模型中的属性

c# - 替换 FilterExpression 中的 MATCH MySQL 函数

c# - 如何在 TreeView 中删除所有未选中的节点及其父节点?

c# - WatiN 和 IE9 关于多个对话框的问题

c# - 将 XAML WPF 窗口转换为 WinForm

c# - 如何在后台同步下载图片?