xaml - mvvmlightlibs - mvvm light uwp
MVVM Light ViewModelLocator (1)
Estoy usando MVVM Light en mi aplicación, con múltiples ensambles en la solución. ¿Cómo puedo tener un ViewModelLocator en cada ensamblaje sin definir en los recursos de App.xaml?
Típicamente ViewModelLocator se define así:
<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>
Creé un Resources.xaml en una biblioteca de clases dentro de mi solución de esta manera:
<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>
Sin embargo, ModuleXLocator no se encuentra:
<phone:PhoneApplicationPage
...
DataContext="{Binding Main, Source={StaticResource ModuleXLocator}}">
No estoy al 100% si respondo tu pregunta, pero responderé a un problema similar que tuve y es la solución. Con suerte es lo que estás buscando.
Problema:
Has diseñado una pequeña y maravillosa aplicación MVVMLight (LittleApp) y ahora deseas usarla como UserControl / Page / Window en otro proyecto (BigApp). El problema es que LittleApp tiene su ViewModelLocator definido en su App.xaml correspondiente que no se usa para BigApp. El resultado es que LittleApp busca su ViewModelLocator en "Big.App''s App.xaml" y falla.
También quiere que LittleApp funcione como un proyecto independiente y no quiera meterse con su diseño.
Da posibles excepciones:
XMLParseException: no se puede encontrar el ViewModelLocator definido en el nodo raíz de LittleApp (porque está definido en un App.xaml no utilizado)
WPFError 40: has utilizado la herramienta MVVMLight para crear ambas aplicaciones y, por lo tanto, ambas tienen un App.xaml con un ViewModelLocator llamado ''Locator'' que apunta a un ViewModel llamado ''Main''. LittleApp podrá resolver esto, pero señalará el MainViewModel incorrecto y, por lo tanto, tendrá conflictos de propiedad.
Solución:
Debe definir ViewModelLocator de LittleApp como un recurso en el nodo raíz de MainView de LittleApp. Entonces, si su MainView es un UserControl llamado LittleApp / View / MainView.xaml, se verá algo como esto.
<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>
Ahora, BigApp solo necesita hacer referencia al ensamblado de LittleApps y agregarlo como espacio de nombre en el nodo raíz del control al que desea agregarlo. Algo como esto.
<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>