【发布时间】:2016-03-07 14:52:02
【问题描述】:
我无法让 Prism 中的导航正常工作。当我单击按钮转到各自的视图时,没有任何反应。
这是人视图(Shell)XAML:
<Window x:Class="MVVMPractice2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
xmlns:Views="clr-namespace:MVVMPractice2.Views"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Margin="108,130,331.4,152.8" Content="View A" Command="{Binding NavigateCommand}" CommandParameter="ViewA"/>
<Button Margin="254,130,185.4,152.8" Content="View B" Command="{Binding NavigateCommand}" CommandParameter="ViewB"/>
<ContentControl prism:RegionManager.RegionName="ContentRegion"/> <!--PRISM POWER-->
</Grid>
</Window>
及其 ViewModel:
public class MainWindowViewModel : BindableBase
{
private readonly IRegionManager regionManager; //PRISM POWER
public DelegateCommand<string> NavigateCommand { get; set; }
public MainWindowViewModel(IRegionManager regionManager)
{
this.regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);
}
private void Navigate(string uri)
{
regionManager.RequestNavigate("ContentRegion", uri);
}
}
和引导程序:
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterType(typeof(object), typeof(ViewA), "ViewA");
Container.RegisterType(typeof(object), typeof(ViewB), "ViewB");
Container.RegisterType<ICustomer, Customer>();
}
}
我将不胜感激。
【问题讨论】:
-
我没有使用 Prism 的视图模型定位器,但它是否因为无法为您的视图找到视图模型而苦苦挣扎?
-
我有 ViewA 和 ViewB 的 ViewModel。如果你愿意,我可以在这里加入他们
-
你试过
RequestNavigate("ContentRegion", "ViewA")吗?顺便说一句,使用RegisterTypeForNavigation<ViewType>()注册导航视图更容易... -
我的猜测是 ViewModel 定位器无法解析您的 ViewModel。可能有几个原因: 命名空间与预期的模式不匹配(它们应该是
MVVMPractice2.Views和MVVMPractice2.ViewModels,如果它们不同,你必须自己配置它或使用默认约定。如果 ViewModels 在不同的程序集中,你也需要进行手动配置。最后一个似乎不适用于您的是 View name =ViewModel 约定(在 Prism 6 中对此约定进行了更改,但前提是 View 被命名为 SomethingView跨度> -
MainWindow和MainWindowViewModel在哪些命名空间中?应该分别是Views和ViewModels。