WPF数据上下文用于设计时和运行时

Jim*_*m C 3 wpf datacontext mvvm

我正在学习WPF,MVVM Light和ViewModelLocator模式,并且遇到了我主窗口数据上下文的困难.

public class ViewModelLocator
   {
      public ViewModelLocator()
      {
         var mainModel = new MainModel();
         Main = new MainViewModel(mainModel);
      }

      public MainViewModel Main { get; private set; }

      public static ViewModelLocator Instance
      {
         get { return Application.Current.Resources["Locator"] as ViewModelLocator; }
      }
   }
Run Code Online (Sandbox Code Playgroud)

在我的app.xaml中:

<Application.Resources>
    <viewModels:ViewModelLocator x:Key="Locator" />
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

当我在主窗口中设置数据上下文时使用:

DataContext="Binding Main, Source={StaticResource Locator}"
Run Code Online (Sandbox Code Playgroud)

它编译但是我绑定到xaml中其他地方的所有MainViewModel的属性都显示为红色,工具提示"无法解析符号".我以为我可以通过指定仅限设计者的数据上下文来解决这个问题:

<Window x:Class="WPFDemo.Windows.MainWindow"
    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:converters="clr-namespace:WPFDemo.Converters"
    xmlns:local="clr-namespace:WPFDemo"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:models="clr-namespace:WPFDemo.Models"
    xmlns:viewModels="clr-namespace:WPFDemo.ViewModels"
    Title="MainWindow" Height="350" Width="525"
    DataContext="Binding Main, Source={StaticResource Locator}"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance, Type=viewModels:MainViewModel,
    IsDesignTimeCreatable=True}">
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢最后一行("字符','在这个位置意外",引用第一个逗号).注意我没有使用ExpressionBlend,但我认为我在课程中听说这行也将启用VisualStudio设计器:

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Run Code Online (Sandbox Code Playgroud)

如何在仍然允许Visual Studio在设计时识别绑定属性的同时使用ViewModelLocator?

Con*_*ngo 8

如果你删除以下后的逗号,最后一行将很好地工作d:DesignInstance:

d:DataContext="{d:DesignInstance Type=viewModels:MainViewModel,
IsDesignTimeCreatable=True}">
Run Code Online (Sandbox Code Playgroud)