首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Catel PersonApplication示例

Catel PersonApplication示例
EN

Stack Overflow用户
提问于 2016-12-07 04:35:06
回答 2查看 145关注 0票数 2

目前正在研究Catel。

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

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

应用程序在运行时正确运行。在Building上没有消息表明XAML或代码中存在问题。声明设计时datacontext的XAML代码是正确的:

代码语言:javascript
复制
d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel,
                                 IsDesignTimeCreatable=True}"

为什么设计器中没有显示设计时数据,有什么解释吗?

我正在使用Visual Studio 2015。

EN

回答 2

Stack Overflow用户

发布于 2016-12-07 07:22:23

尽管如此,我还是非常欣赏Catel的框架,我也见证了这种奇怪的行为

依赖属性似乎没有连接到模型修饰属性。但是,虽然它应该得到修复,但您也可以直接解决设置依赖属性的问题。

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2016-12-07 18:21:54

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

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

从我的头顶,我们甚至检查我们是否在一个设计器中运行,如果是的话,跳过相当多的逻辑。

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

代码语言:javascript
复制
if (CatelEnvironment.IsInDesignMode)
{
    var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
    viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel")
}

这将允许您的应用程序在设计模式下首选MyPersonDesignTimeViewModel,但在应用程序运行时仍将加载实际的视图模型。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41004370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档