Я пытаюсь совместить Prism (только для CompositeUI) и MVVM Light Toolkit (для архитектуры MVVM = D), но у меня возникают некоторые проблемы с Light ViewModelLocator.Когда мы используем локатор в «простом» приложении WPF, мы можем использовать ресурс приложения в App.xaml, например:
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
Но когда мы используем Prism, наш бизнес-код находится внутри модуля.проект, и у него нет App.xaml, затем я попытался поместить этот ресурс в ресурсы View:
<Window.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Window.Resources>
Он просто отключил мои ошибки режима разработки (и также времени выполнения), ноПредставление не отображается в назначенном ему регионе.
Кто-то уже пытался сделать что-то подобное?Можно ли заставить Prism и MVVM Light работать вместе?
Это мой "полный" код:
(ViewLight.xaml)
<Window x:Class="TryERP2.Financeiro.View.ViewLight"
... a lot of NS ...
mc:Ignorable="d"
xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
d:DesignHeight="150" d:DesignWidth="245" SizeToContent="WidthAndHeight">
<Window.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Window.Resources>
<Grid DataContext="{Binding Light, Source={StaticResource Locator}}">
<Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" />
</Grid>
</Window>
ViewLightModel.cs:
public class ViewLightModel : ViewModelBase
{
public ViewLightModel()
{ }
public const string MyButtonTextPropertyName = "MyButtonText";
private string _myButtonText = "Button Text";
public string MyButtonText
{
get
{ return _myButtonText; }
set
{
if (_myButtonText == value)
{ return; }
_myButtonText = value;
RaisePropertyChanged(MyButtonTextPropertyName);
}
}
}
Financeiro.cs (Класс инициализатора модуля ... Частично показан ... Как раз там, где я регистрируюсь и "запускаю" представления):
var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
container.RegisterType<Object, ViewLight>("ViewLight");
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
var main = new Uri("ViewLight", UriKind.Relative);
regionManager.RequestNavigate("Desktop", main);
A "нормальный"Приложение MVVM Light содержит файл App.xaml, который (я думаю) не используется в представлениях модулей Prism.Этот файл имеет следующую структуру:
<Application x:Class="TryERP2.Financeiro.App"
... a lot of NS ...
xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
StartupUri="MainWindow.xaml"
mc:Ignorable="d">
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
</Application.Resources>
</Application>
Вот что происходит, когда я выполняю свое приложение.Представление, которое было на модуле, должно быть загружено в это пустое пространство, показывая его кнопку, но ничего не произошло:
http://imageshack.us/photo/my-images/818/capturarwy.png
Когда я пытаюсь изменить это представление и поставить на его место«простой вид» (без использования MVVMLight), он работает отлично, как показано на рисунке ниже:
http://imageshack.us/photo/my-images/513/capturar1a.png