2017-06-15 82 views
1

我使用带有MVVM-Light的TemplateStudio创建了一个UWP应用程序,无法将设计数据显示在Visual Studio(或Blend)中。MVVM-Light没有显示设计模式的数据

视图模型定位:

public class ViewModelLocator 
{ 
    NavigationServiceEx _navigationService = new NavigationServiceEx(); 

    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if(ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IFooProvider, DesignFooProvider>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IFooProvider, FooProvider>(); 
     } 

     SimpleIoc.Default.Register(() => _navigationService); 
     SimpleIoc.Default.Register<ShellViewModel>(); 
     Register<MainViewModel, MainPage>(); 
     Register<FooViewModel, FooView>(); 

     _navigationService.SetMainViewModel(MainViewModel); 
    } 

    public MainViewModel MainViewModel => ServiceLocator.Current.GetInstance<MainViewModel>(); 

    public ShellViewModel ShellViewModel => ServiceLocator.Current.GetInstance<ShellViewModel>(); 

    public FooViewModel FooViewModel => ServiceLocator.Current.GetInstance<FooViewModel>(); 

    public void Register<VM, V>() where VM : class 
    { 
     SimpleIoc.Default.Register<VM>(); 
     _navigationService.Configure(typeof(VM).FullName, typeof(V)); 
    } 
} 

FooViewModel具有绑定到FooView.xaml一个ObservableCollection

现在,当我运行的实际代码一切都正常运行,我的FooViewModel正确地获取与从数据填充FooProvider。

虽然在Visual Studio或Blend中查看FooView,但没有数据显示在FooView.xaml的ListBox中。

有没有办法在设计时调试出了什么问题?如何修复我的定位器,以便在设计期间在FooView中正确显示数据?

(注意:我添加到上面的类的唯一代码与FooView相关的项目有关,其他人被预填充)。

回答

3

有没有办法在设计时调试出错?

是的,我们可以。下面是步骤:

  1. 打开任务管理器,找出XDesProc.exe和日志信息的PID挖掘
  2. 设置断点要检查
  3. 构造函数代码或任何代码
  4. 从Blend打开你的应用程序,找出第二个XDesProc.exe并记录它的PID
  5. 关闭FooView页面。
  6. 转到Visual Studio,选择Debug-> Attach to Process,然后选择managed(v4.6,v4.5,v4.0)代码,然后选择Blend PID of XDesProc.exe
  7. 返回Blend并打开您想要查看设计数据问题的页面
  8. Visual Studio将在您想要的断点处断开。

顺便说一句,我没有你的代码,所以我不太确定我是否已经转载了你的问题。调试完成后,您可以调试共享我们的信息。

如何解决我的定位器在设计时间内在FooView中正确显示数据?

这里的一个解决方法是使用下面的方法来手动添加设计时数据:

<Page 
x:Class="MVVMLightStartUp.Views.FooViewPage" 
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:vm="using:MVVMLightStartUp.ViewModels" 
DataContext="{Binding FooViewViewModel, Source={StaticResource Locator}}" 
d:DataContext="{d:DesignInstance Type=vm:DesignTimeViewModel, IsDesignTimeCreatable=True}" 
mc:Ignorable="d"> 

而且在后面的代码定义DesignTimeViewModel。CS:

public class DesignTimeViewModel 
{ 
    public ObservableCollection<Foo> BindingData { get; set; } 

    public DesignTimeViewModel(DesignTimeDataService dataservice) 
    { 
     var FooList = dataservice.GetFoo(); 
     BindingData = new ObservableCollection<Foo>(FooList); 
    } 
} 

对于您可以参考下面的一些细节博客:

https://docs.microsoft.com/en-us/windows/uwp/data-binding/displaying-data-in-the-designer https://msdn.microsoft.com/en-us/magazine/dn169081.aspx

+0

调试工作完美。问题是这一行: 'SimpleIoc.Default.Register((=> _navigationService);' ,它引发了一个异常,说NavigationService已经注册。所以我把它扔进设计模式检查,现在一切正常 –

+1

好的。我可以在我的代码中使用MVVMLight重现相同的效果。听起来像这是MVVMLight的问题 –