gpt4 book ai didi

c# - 将新的 ViewModel 添加到 MVVM Light Toolkit 中的 ViewModelLocator

转载 作者:行者123 更新时间:2023-11-30 22:15:24 25 4
gpt4 key购买 nike

我知道这个问题有些基础,但目前,我完全不知道应该如何将新的 ViewModel 添加到 MVVM Light Toolkit 中的 ViewModelLocator 类。

我目前的实现是这样的:

首先假设我有一个名为 Settings 的窗口、一个名为 SettingsViewModel 的 ViewModel 和一个名为 ViewModelLocator 的 ViewModelLocator。

首先,我在 VieModelLocator 构造函数中调用 CreateSettings():

public ViewModelLocator()
{
if (ViewModelBase.IsInDesignModeStatic)
{

}
else
{
CreateSettings();
}

CreateMain();
}

请注意,这将始终运行,因为我没有使用 blend 并在每次尝试运行它时构建应用程序。现在介绍 `CreateSettings() 方法。

我不知道自己在做什么,所以我尝试安全行事,并按照用于创建和管理 MainViewModel 的方法对所有内容进行建模。

public static void CreateSettings()
{
if (_settings == null)
{
_settings = new SettingsViewModel();
}
}

然后是其他一些仿照 MainViewModel 所用方法的方法:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public SettingsViewModel Settings
{
get
{
return SettingsStatic;
}
}

public static SettingsViewModel SettingsStatic
{
get
{
if (_settings == null)
{
CreateSettings();
}

return _settings;
}
}

在我的 Settings 窗口 Xaml 中:

<Window x:Class="_5500A_Auto_Calibrator.Settings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Settings" Height="300" Width="300"
DataContext="{Binding Source={StaticResource Locator}, Path=Settings}">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>

然后从我的 MainViewModel 打开窗口,如下所示:

Settings settings = new Settings();
settings.Show();

如果我尝试这样做,我会收到一个异常:

"'Provide value on 'System.Windows.StaticResourceExtension' threw an exception.' Line number '4' and line position '39'."

还有一个内部异常:

"Cannot find resource named 'Locator'. Resource names are case sensitive."

我已经阅读了有关 Window 无法找到 Locator 资源的错误,但大多数都与混合有关。

我目前的看法是我做错了什么,但是关于添加新 ViewModel 的文档太少了,我不确定我做错了什么。

编辑:

我的 App.Xaml:

<Application x:Class="_5500A_Auto_Calibrator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:_5500A_Auto_Calibrator.ViewModel"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
StartupUri="MainWindow.xaml"
mc:Ignorable="d">

<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
</Application.Resources>

</Application>

最佳答案

通常是这样的:

    public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}

SimpleIoc.Default.Register<MainViewModel>();
}

/// <summary>
/// Gets the Main property.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}

...
}

ViewModelLocator 是静态的,您的似乎不是。它通常位于 ViewModel 文件夹中(假设您使用 nuget 安装了 mvvmlight,然后添加了一个新的 wvvm 项目。

然后它继续处理设计和运行时的 2 个案例。 (如果你不使用它,你可以跳过 if (IsInDesignMode) ... 位,而只是把你的逻辑。(虽然很遗憾,因为预览一些是很好的VS 设计器中的假数据......)

添加新的 ViewModels 通常涉及创建该类型的属性,并将它们注册到定位器,这样您就可以检索它们......但这是不同的,我相信可以以不同的方式完成......

希望这对您有所帮助,如果还有什么我可以帮忙的,请告诉我。

关于c# - 将新的 ViewModel 添加到 MVVM Light Toolkit 中的 ViewModelLocator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978082/

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