2

目前就读于卡特。

在 Catel.Examples 的 PersonApplication 中 - 具体来说,PersonWindow.xaml:设计时数据未显示在 Visual Studio 设计器中。

在 PersonViewModel 的代码中,公共属性被注释掉了。显然这是因为代码使用 Fody 在运行时创建模型属性。因此,我取消了公共属性的注释,假设 Visual Studio 设计器需要公共属性才能在设计器中显示设计时数据。尽管如此,DesignPersonViewModel 的设计时数据并未显示在设计器中。

应用程序在运行时正确运行。没有关于构建的消息表明 XAML 或代码中的问题。声明设计时数据上下文的 XAML 代码是正确的:

d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel,
                                 IsDesignTimeCreatable=True}"

为什么设计时数据没有显示在设计器中的任何解释?

我正在使用 Visual Studio 2015。

4

2 回答 2

1

第二个示例需要视图模型调用更多逻辑(模型到视图模型映射)。原因是您希望设计时视图模型在设计时自动进行模型映射。虽然我们可以实现它,但它没有多大意义。

设计时视图模型应该是非常轻量级和简单的视图模型,只是为了在设计器中显示一些虚拟数据。它们不应该在运行时表现为功能齐全的视图模型,因为它会减慢设计器的速度,并且可能会在出现异常时使设计器崩溃。

从我的脑海中,我们甚至检查我们是否在设计器中运行,如果是,则跳过相当多的逻辑。

因此,尽管这看起来像一个错误,但它是设计使然,因为设计时视图模型应该简单而轻便。我们建议,出于设计目的,您创建一个非常简单的并为 ViewModelLocator 添加一个额外的命名约定。例如:

if (CatelEnvironment.IsInDesignMode)
{
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel")
}

这将允许您的应用在设计模式下更喜欢 MyPersonDesignTimeViewModel,但在应用运行时仍会加载实际的视图模型。

请注意,这仅在视图实际上会在设计时尝试解析视图模型时才有效,我不知道这一点,因为我从不使用设计时。

于 2016-12-07T10:21:53.770 回答
1

尽管我对 Catel 的框架非常赞赏,但我也目睹了这种奇怪的行为

似乎依赖属性没有连接到 [Model] 修饰属性。但是,虽然它应该被修复,但您可以直接设置依赖属性。

public PersonViewModel(Person person) // this approach works
{
    // Person = person ?? new Person();
    // The following 2 lines provide DesignTime data
    SetValue("FirstName", "Joe");
    SetValue("LastName", "Dalton");
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}

public PersonViewModel(Person person) // this approach does not work
{
    // Person = person ?? new Person();
    Person = new Person() { FirstName = "Joe", LastName = "Dalton" };
    GenerateData = new Command<object, object>(OnGenerateDataExecute, OnGenerateDataCanExecute);
    ToggleCustomError = new Command<object>(OnToggleCustomErrorExecute);
}
于 2016-12-06T23:22:22.560 回答