我知道这个问题有点基础,但是目前我完全不知道如何在MVVM
Light Toolkit中为我的ViewModelLocator类添加一个新的ViewModel。
我目前的实施情况如下:
首先假设我有一个名为Settings
的窗口,一个名为SettingsViewModel
的ViewModel和一个ViewModelLocator ViewModelLocator
。
首先,我在VieModelLocator构造函数中调用CreateSettings()
:
public ViewModelLocator()
{
if (ViewModelBase.IsInDesignModeStatic)
{
}
else
{
CreateSettings();
}
CreateMain();
}
请注意,这将始终运行,因为我没有使用混合并在每次尝试运行时构建应用程序。现在是`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>
答案 0 :(得分:3)
通常看起来如此:
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设计器中预览一些假数据真好...)
添加新的ViewModel通常涉及创建该类型的属性,并使用定位器注册它们,这样您就可以检索它们......但这有所不同,可以采用不同的方式,我相信......
希望得到这个帮助,如果还有其他任何我可以提供的帮助,请告诉我。
答案 1 :(得分:0)
您的数据上下文绑定尝试比声明资源更早应用。尝试以这种方式声明绑定(当然,只有当MainSkin.xaml
或应用程序资源包含Locator
资源时,这才有用:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Window.DataContext>
<Binding Source="{StaticResource Locator}" Path="Settings"/>
</Window.DataContext>