gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:59:01 25 4
gpt4 key购买 nike

我需要编写一个小应用程序来读取配置文件并生成一些报告。我希望最终使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com