我正在尝试将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时,我们的业务代码在Module项目中,并且它没有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);
“普通”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)时,它的工作方式非常完美,如下图所示:
答案 0 :(得分:0)
在ViewLight.xaml中,您应该更改
<Window.Resources>
<ResourceDictionary>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Window.Resources>
到
<Window.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Window.Resources>
因为Window.Resources已经是ResourceDictionary,并且您在其中创建了另一个。您无法在此处访问定位器资源:
<Grid DataContext="{Binding Light, Source={StaticResource Locator}}">
另一种选择是使用MergedDictionary。
答案 1 :(得分:0)
对不起我犯了一个大错。 您可能已经注意到,我正在构建一个Ribbon应用程序,而我正在尝试在空白区域下显示控件。 可以在那里显示的项目是控件。它没有用,因为我试图显示一个窗口:
<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">
... etc
我通过将其更改为用户控件而不是窗口来修复它,并且它工作得很好。
我的新ViewLight.xaml:
<UserControl x:Class="TryERP2.Financeiro.View.ViewLight"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel"
d:DesignHeight="150" d:DesignWidth="245">
<UserControl.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</UserControl.Resources>
<Grid DataContext="{Binding Light, Source={StaticResource Locator}}">
<Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" />
</Grid>
</UserControl>
我的新ViewLight.xaml.cs(代码隐藏):
public partial class ViewLight : UserControl
{
public ViewLight()
{
InitializeComponent();
}
}
ViewModel仍然是一样的。