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

时间:2014-06-12 16:48:53

标签: wpf mvvm datacontext

我正在学习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; }
      }
   }

和我的app.xaml:

<Application.Resources>
    <viewModels:ViewModelLocator x:Key="Locator" />
</Application.Resources>

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

DataContext="Binding Main, Source={StaticResource Locator}"

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

<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}">

但是编译器并不喜欢最后一行(&#34;字符&#39;,&#39;在这个位置是意外的&#34;,引用第一个逗号)。注意我没有使用ExpressionBlend,但我认为我在课程中听说过这一行也会启用VisualStudio设计器:

 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

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

2 个答案:

答案 0 :(得分:8)

如果您在d:DesignInstance之后删除逗号,那么最后一行将很有效:

d:DataContext="{d:DesignInstance Type=viewModels:MainViewModel,
IsDesignTimeCreatable=True}">

答案 1 :(得分:0)

使用默认数据上下文也应该在设计时工作:

DataContext="{Binding Main, Source={StaticResource Locator}}"

如果没有,请尝试编译proyect并再次签出。 您可以使用IsInDesignMode提供的MvvmLight Toolkit属性管理要在设计时显示的属性值。默认情况下,MainViewModel的构造函数如下所示:

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            // Code runs "for real"
        }
    }

希望这会有所帮助......