我在应用程序中使用MVVM Light,在解决方案中有多个程序集。
如何在不定义App.xaml资源的情况下在每个程序集中具有ViewModelLocator?
通常,ViewModelLocator的定义如下:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Sol1;component/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<viewModels:ViewModelLocator xmlns:main="clr-namespace:MainModule.ViewModel;assembly=MainModule" x:Key="Locator" d:IsDataSource="True"/>
</ResourceDictionary>
我在解决方案中的类库中创建了Resources.xaml,如下所示:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ModuleX="clr-namespace:ModuleX">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Common;component/CommonResources.xaml" />
</ResourceDictionary.MergedDictionaries>
<ModuleX:ViewMoldelLocator x:Key="ModuleXLocator" />
</ResourceDictionary>
但是,找不到ModuleXLocator:
<phone:PhoneApplicationPage
...
DataContext="{Binding Main, Source={StaticResource ModuleXLocator}}">
最佳答案
如果我回答您的问题,我不是100%,但是我会回答我遇到的类似问题及其解决方案。希望它是您想要的。
问题:
您已经设计了一个很棒的MVVMLight小应用程序(LittleApp),现在您想将其用作另一个项目(BigApp)中的UserControl/Page/Window。问题是LittleApp在对应的App.xaml中定义了ViewModelLocator,而BigApp不使用它。结果是LittleApp在“BigApp的App.xaml”中寻找其ViewModelLocator并失败。
您还希望将LittleApp作为一个独立的项目工作,因此不要与它的设计混为一谈。
给出可能的异常:
XMLParseException:在LittleApp的根节点中定义的ViewModelLocator找不到(因为它在未使用的App.xaml中定义)
WPF错误40:您已经使用MVVMLight工具创建了两个应用程序,因此两个应用程序都有一个App.xaml,其中的ViewModelLocator称为“Locator”,该ViewModelLocator指向一个名为“Main”的ViewModel。 LittleApp将能够解决此问题,但它将指向错误的MainViewModel,从而导致属性冲突。
解决方案:
您需要在LittleApp的MainView的根节点中将LittleApp的ViewModelLocator定义为资源。因此,如果您的MainView是一个名为LittleApp/View/MainView.xaml的UserControl,它将看起来像这样。
<UserControl x:Class="LittleApp.View.MainView"
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:vm="clr-namespace:LittleApp.ViewModel"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Skins/MainSkin.xaml" />
</ResourceDictionary.MergedDictionaries>
<vm:ViewModelLocator x:Key="Locator"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource Locator}"/>
</UserControl.DataContext>
<Grid>
.
. Your Control Design
.
.
.
</Grid>
</UserControl>
现在,BigApp只需要引用LittleApps程序集并将其作为 namespace 添加到要添加到其的控件的根节点中。这样的事情。
<Page x:Class="BigApp.View.Page1"
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:LittleView="clr-namespace:LittleApp.View;assembly=LittleApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<LittleView:MainView/>
</Grid>
</Page>
关于xaml - MVVM Light ViewModelLocator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24641314/