MVVM-Light 未显示设计模式数据
Design Mode data not showing up with MVVM-Light
我使用带有 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 的列表框中没有显示任何数据。
有没有办法在设计时调试出错的地方?如何修复我的定位器以在设计时在 FooView 中正确显示数据?
(注意:我在上面添加的唯一代码 class 是与 FooView 相关的项目,其他的是预填充的)。
Is there a way to debug what's going wrong during design time?
是的,我们可以。以下是步骤:
- 打开你的任务管理器,找到XDesProc.exe并从详细信息中记录它的PID点击
- 将断点设置到构造函数代码或您要检查的任何代码
- 从 Blend 打开您的应用程序,找出第二个 XDesProc.exe 并记录其 PID
- 关闭 FooView 页面。
- 转到 Visual Studio,选择 Debug->Attach to Process,然后选择 managed(v4.6,v4.5,v4.0) code,然后 select [ 的 Blend PID =50=]
- 返回 Blend 并打开您要查看设计数据问题的页面
- Visual Studio 会在你想要的断点处中断。
顺便说一句,我没有你的代码,所以我不确定我是否重现了你的问题。调试后可以调试分享信息。
How do I fix my locator to correctly display data in FooView during design time?
此处的解决方法是使用以下方式手动添加设计时数据:
<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
我使用带有 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 的列表框中没有显示任何数据。
有没有办法在设计时调试出错的地方?如何修复我的定位器以在设计时在 FooView 中正确显示数据?
(注意:我在上面添加的唯一代码 class 是与 FooView 相关的项目,其他的是预填充的)。
Is there a way to debug what's going wrong during design time?
是的,我们可以。以下是步骤:
- 打开你的任务管理器,找到XDesProc.exe并从详细信息中记录它的PID点击
- 将断点设置到构造函数代码或您要检查的任何代码
- 从 Blend 打开您的应用程序,找出第二个 XDesProc.exe 并记录其 PID
- 关闭 FooView 页面。
- 转到 Visual Studio,选择 Debug->Attach to Process,然后选择 managed(v4.6,v4.5,v4.0) code,然后 select [ 的 Blend PID =50=]
- 返回 Blend 并打开您要查看设计数据问题的页面
- Visual Studio 会在你想要的断点处中断。
顺便说一句,我没有你的代码,所以我不确定我是否重现了你的问题。调试后可以调试分享信息。
How do I fix my locator to correctly display data in FooView during design time?
此处的解决方法是使用以下方式手动添加设计时数据:
<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