微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UserControl上的MVVMLight ViewModelLocator

如何解决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 举报,一经查实,本站将立刻删除。