我正在学习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?
答案 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"
}
}
希望这会有所帮助......