【问题标题】:Design Mode data not showing up with MVVM-LightMVVM-Light 未显示设计模式数据
【发布时间】:2017-11-17 10:27:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    有没有办法在设计时调试问题所在?

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

    1. 打开您的任务管理器,找出XDesProc.exe并从详细信息点击记录其PID
    2. 将断点设置为构造函数代码或您要检查的任何代码
    3. 从 Blend 打开您的应用,找出第二个 XDesProc.exe 并记录其 PID
    4. 关闭 FooView 页面。
    5. 进入Visual Studio,选择Debug->Attach to Process,然后选择managed(v4.6,v4.5,v4.0) code,然后选择XDesProc.exe的Blend PID
    6. 返回 Blend 并打开您要查看设计数据问题的页面
    7. 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

    【讨论】:

    • 调试工作完美。问题是这一行:SimpleIoc.Default.Register(() =&gt; _navigationService);,它抛出了一个异常,说 NavigationService 已经注册。所以我把它扔进了设计模式检查,现在一切正常
    • 好的。在我的代码中使用 MVVMLight 时,我可以重现相同的内容。听起来这是一个关于 MVVMLight 的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多