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

3

我正在学习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的所有属性都显示为红色,并且提示“无法解析该符号”。我认为可以通过指定仅适用于设计师的数据上下文来解决此问题:

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

但是编译器不喜欢最后一行(“在此位置意外出现字符 ','”,指的是第一个逗号)。请注意,我没有使用ExpressionBlend,但我记得在一门课程中听说过这行代码也能启用VisualStudio的设计功能:

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

我该如何在启用Visual Studio设计时识别绑定属性的同时使用ViewModelLocator?

当您删除那个不应该存在的逗号时会发生什么?(是的,在VS中可以使用设计时数据) - user1228
你需要用大括号 { } 包装它 --- DataContext="{Binding Main, Source={StaticResource Locator}}" - bdimag
@Will - 然后整行代码会被标记为错误,提示“此对象没有无参构造函数”。 - Jim C
@bdimag - 是的,就是这样!请发布为答案,以便我可以给你信用。 - Jim C
1
@bdimag 也是正确的,你的绑定不包含在花括号内。(删除所有这些...我以前从未见过这种情况,会认为这是不正确的语法,但我现在无法测试它 :/) - user1228
2个回答

14

如果您删除d:DesignInstance后面的逗号,最后一行将正常工作:

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

1
使用默认数据上下文在设计时也应该可以工作:
DataContext="{Binding Main, Source={StaticResource Locator}}"

如果没有,请尝试编译该项目并再次检查。 您可以使用MvvmLight Toolkit提供的IsInDesignMode属性,在设计时管理要显示的属性值。默认情况下,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"
        }
    }

希望这有所帮助...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接