我正在开发MVVMLight / WPF项目,需要添加一大块功能,其中包括多个视图和视图模型。我知道在不久的将来,其他项目中将使用相同的功能,因此我希望将此功能作为自己的项目,我可以根据需要添加到其他解决方案,几乎不需要修改。
我首先添加了第二个MVVMLight项目(Beta),删除了标准的MainWindow.xaml和MainViewModel.cs文件,并创建了一个简单的UserControl和相关的View模型。
<UserControl x:Class="Beta.View.TestView"
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"
xmlns:ignore="http://www.ignore.com"
mc:Ignorable="d ignore"
DataContext="{Binding Test_VM, Source={StaticResource Locator} }">
<Grid>
<TextBlock Text="{Binding WelcomeMessage}" />
</Grid>
</UserControl>
public class TestViewModel : ViewModelBase
{
#region Properties
public string WelcomeMessage
{
get
{
return "Hello World!";
}
}
#endregion Properties
#region Constructors
/// <summary>
/// Initializes a new instance of the TestViewModel class.
/// </summary>
public TestViewModel()
{
}
#endregion Constructors
}
我可以添加Beta作为对原始项目(Alpha)的引用,并通过将视图插入到堆栈面板中来显示视图,如下所示:
<StackPanel Name="MasterStackPanel"
DockPanel.Dock="Top">
<beta:TestView />
</StackPanel>
这样做时,一切似乎都能正常工作。我遇到的问题是当我尝试将一个Property从TestViewModel绑定到TestView时。
在TestView中,如果我这样做:
<TextBlock Text="Hello World" />
TestView在运行时正确显示。但是当我将TextBlock绑定到这样的属性时:
<TextBlock Text="{Binding WelcomeMessage}" />
消息未显示且Beta的定位器似乎被忽略(datacontext未被绑定),我从Snoop收到以下错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'WelcomeMessage' property not found on 'object' ''MainViewModel' (HashCode=51013215)'. BindingExpression:Path=WelcomeMessage; DataItem='MainViewModel' (HashCode=51013215); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Test_VM' property not found on 'object' ''ViewModelLocator' (HashCode=22749765)'. BindingExpression:Path=Test_VM; DataItem='ViewModelLocator' (HashCode=22749765); target element is 'TestView' (Name=''); target property is 'DataContext' (type 'Object')
我相信这意味着Test_VM和&amp;的结合。 WelcomeMessage试图通过Alpha定位器而不是Beta定位器找到。我正在使用在每个项目中启动MVVMLight项目时默认创建的ViewModelLocator。
是否有可能拥有第二个“定位器”,如果有,我需要做些什么才能使其正常工作?
答案 0 :(得分:1)
我认为您应该在系统的应用程序根中仅具有一个Locator,并使用库项目中的“ MvvmLightLibs”库并在alpha项目中引用它,并在其中添加TestViewModel-Property。定位器。