2016-12-06 73 views
2

正在学习Catel。Catel Person应用示例

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

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

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

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

为什么在设计时数据不会在设计表现出任何解释?

我使用Visual Studio 2015年

回答

1

但是我对Catel的框架强劲升值,我也目睹了这一奇怪的行为

看来,依赖属性没有连接到[产品型号]装饰性能。但是,虽然应该修复它,但可以直接设置依赖项属性。

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

非常好。这工作。我想知道为什么Geert没有修复这些代码。虽然对Catel留下了深刻的印象。但是,这是一个相当不错的学习曲线 - 考虑到它的能力,仍然值得。 谢谢,胡里奥。 –

1

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

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

从我的头顶开始,我们甚至检查我们是否在设计师身边运行,如果是的话,跳过一些逻辑。

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

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

这将使您的应用程序更喜欢MyPersonDesignTimeViewModel在设计模式,但应用程序运行时会加载还是实际的视图模式。

请注意,这只适用于视图实际上会在设计时尝试解析视图模型的情况,我不知道从头开始,因为我从不使用设计时间。