目前正在研究Catel。
在Catel.Examples的PersonApplication中-具体地说,PersonWindow.xaml:设计时数据没有显示在Visual Studio设计器中。
在PersonViewModel的代码中,公共属性被注释掉了。显然,这是因为代码在运行时使用Fody来创建模型属性。因此,假设Visual Studio设计器需要公共属性来显示设计器中的设计时数据,我取消了对公共属性的注释。尽管如此,DesignPersonViewModel的设计时数据不会显示在设计器中。
应用程序在运行时正确运行。在Building上没有消息表明XAML或代码中存在问题。声明设计时datacontext的XAML代码是正确的:
d:DataContext="{d:DesignInstance ViewModels:DesignPersonViewModel,
IsDesignTimeCreatable=True}"为什么设计器中没有显示设计时数据,有什么解释吗?
我正在使用Visual Studio 2015。
发布于 2016-12-07 07:22:23
尽管如此,我还是非常欣赏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);
}发布于 2016-12-07 18:21:54
第二个示例需要视图模型调用更多的逻辑(模型到视图模型的映射)。原因是您希望设计时视图模型在设计时自动执行模型映射。虽然我们可以实现它,但它没有多大意义。
设计时视图模型应该是非常轻量级和简单的视图模型,只是为了在设计器中显示一些虚拟数据。它们不应该在运行时表现为全功能视图模型,因为这会减慢设计器的速度,并可能在出现异常的情况下使设计器崩溃。
从我的头顶,我们甚至检查我们是否在一个设计器中运行,如果是的话,跳过相当多的逻辑。
因此,尽管这看起来像是一个bug,但它是设计出来的,因为设计时视图模型应该是简单和轻便的。出于设计目的,我们建议您创建一个非常简单的命名约定,并为ViewModelLocator添加一个额外的命名约定。例如:
if (CatelEnvironment.IsInDesignMode)
{
var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
viewModelLocator.NamingConventions.Insert(0, "[UP].ViewModels.[VW]DesignTimeViewModel")
}这将允许您的应用程序在设计模式下首选MyPersonDesignTimeViewModel,但在应用程序运行时仍将加载实际的视图模型。
请注意,只有当视图在设计时实际尝试解析视图模型时,这才有效,我不知道这一点,因为我从来不使用设计时。
https://stackoverflow.com/questions/41004370
复制相似问题