如何解决UserControl上的MVVMLight ViewModelLocator
| 是否可以在UserControl上使用MVVMLight viewmodelLocator。 我已经按照与MainWindow相同的方式将其添加到用户控件中,但是在VS2010中出现错误/弹出窗口,指出“找不到名为\'Locator \'的资源。资源名称区分大小写。\“ 有人尝试过吗? 到目前为止,我拥有的代码几乎是标准的MVVMLight WPF入门应用程序... 用户控件<UserControl x:Class=\"NavTest3.PersonControl\"
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"
mc:Ignorable=\"d\"
Height=\"116\" MinWidth=\"250\" Width=\"300\"
DataContext=\"{Binding Person,Source={StaticResource Locator}}\"
>
<!---->
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source=\"Skins/MainSkin.xaml\" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
App.xaml包含..
<Application.Resources>
<!--Global View Model Locator-->
<vm:viewmodelLocator x:Key=\"Locator\"
d:IsDataSource=\"True\" />
</Application.Resources>
因此问题在于在userControl上设置\“ DataContext = \” {Binding Person,Source = {StaticResource Locator}} \“。\”
如前所述,这样做将意味着该用户控件的每个实例将共享相同的viewmodel,但是我想在继续之前先了解这个问题。
解决方法
是的,可以,您需要在用户控件中创建静态资源
<UserControl x:Class=\"MvvmLight1.UserControl1\"
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"
mc:Ignorable=\"d\"
d:DesignHeight=\"300\" d:DesignWidth=\"300\"
xmlns:vm=\"clr-namespace:MvvmLight1.ViewModel\"
>
<UserControl.Resources>
<vm:ViewModelLocator x:Key=\"Locator\" d:IsDataSource=\"True\" />
</UserControl.Resources>
<Grid>
</Grid>
</UserControl>
但是IMO将MVVM Light ViewModelLocator用于UserControles不是一个好主意,因为它是静态属性,当您实例化用户控件的多个实例时,它们将具有相同的通用ViewModel,因此它们的行为均相同如果您决定在整个项目中一次使用UserControl,这不是我们想要的。
要解决此问题,您需要通过将所有属性设置为非静态来修改ViewModelLocator,例如:
public class ViewModelLocator
{
// v--- You got to comment this out
private /*static*/ MainViewModel _main;
public ViewModelLocator()
{
CreateMain();
}
public /*static*/ MainViewModel MainStatic
{
get
{
if (_main == null)
{
CreateMain();
}
return _main;
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Performance\",\"CA1822:MarkMembersAsStatic\",Justification = \"This non-static member is needed for data binding purposes.\")]
public MainViewModel Main
{
get
{
return MainStatic;
}
}
public /*static*/ void ClearMain()
{
_main.Cleanup();
_main = null;
}
public /*static*/ void CreateMain()
{
if (_main == null)
{
_main = new MainViewModel();
}
}
public /*static*/ void Cleanup()
{
ClearMain();
}
}
, 资源的加载顺序可能有问题...尝试分配层次结构中较低元素的DataContext,例如用户控件下方的网格。
<UserControl x:Class=\"NavTest3.PersonControl\"
xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"
mc:Ignorable=\"d\" Height=\"116\" MinWidth=\"250\" Width=\"300\">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source=\"Skins/MainSkin.xaml\" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid DataContext=\"{Binding Person,Source={StaticResource Locator}}\">
<!-- content -->
</Grid>
</UserControl>
编辑:
尝试在Visual Studio的属性部分中使用数据绑定来设置绑定,并确认您看到了定位器。选择DataContext应该放置的元素,找到DataContext属性,然后单击进入属性值区域。现在应该打开一个对话框,您可以在其中选择定位器。可能会解决问题,或帮助您找到解决之道。还要在绑定之前重建项目。
, 验证您的ViewModel之一中没有引发异常。通常,当我收到该错误时,无法实例化定位器,因为上游Viewmodel构建之一会抛出异常。您可以发布Locator构造函数吗?
如果您想自己解决问题,请在VMLocator中的第一个CreateVM语句上设置一个断点,然后查看哪个VM引发了异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。