设计模式数据未显示MVVM-Light

时间:2017-06-15 04:53:02

标签: xaml mvvm uwp mvvm-light uwp-xaml

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

查看模型定位器:

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相关的项目有关,其他的是预先填充的。)

1 个答案:

答案 0 :(得分:3)

  

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

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

  1. 打开任务管理器,找出 XDesProc.exe 并从详细信息中记录其PID
  2. 将断点设置为构造函数代码或要检查的任何代码
  3. 从Blend打开您的应用,找出第二个 XDesProc.exe 并记录其PID
  4. 关闭FooView页面。
  5. 转到Visual Studio,选择Debug-&gt; Attach to Process,然后选择managed(v4.6,v4.5,v4.0)代码,然后选择XrdProc.exe的Blend PID
  6. 返回Blend并打开您要查看设计数据问题的页面
  7. Visual Studio将在您想要的断点处中断。
  8. 顺便说一下,我没有你的代码所以我不确定我是否已经复制了你的问题。您可以在调试后调试共享我们的信息。

      

    如何在设计时修复我的定位器以在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