从 Caliburn Micro 迁移到 Catel
Migrate from Caliburn Micro to Catel
我正在评估将一个全新的项目从 Caliburn Micro 迁移到 Catel。
我想和你分享我的想法并得到你的反馈
让我们从我的应用程序结构开始:
- 基于MVVM的WPF应用
- Telerik 用户控制套件
- 使用 ServiceStack 从网络服务器检索数据
- 为 IoC 使用 SimpleInjector
- 用于日志记录的 NLog
- TCP/IP 连接到远程服务器
- FW 4.0 与 Microsoft.BCL.Async
- 应用程序类似于Visual Studio(对接)
现在结构几乎已经清楚了,我将从我的问题开始:
- 我的模型是通过 ServiceStack.OrmLite 填充的,所以它们是 属性 的 POCO 而不是依赖性 属性-like ,因为模型是在网络服务器和 WPF 部分共享的,我不我想从 ModelBase 继承,当数据到达 WPF 部分时,我是否必须重新创建从 ModelBase 继承的对象?
- RadGridView 中显示的数据绑定到模型 属性,据我所知 here,我必须将模型传递给 ViewModel 我如何绑定这些数据数据到网格或一般视图?
- 我发现在 CM the Convention 中非常有用,所以如果我将 TextBox 命名为 x:Name="Surname",它会查找 属性 Surname,在 Catel 中我应该这样做吗?或者是否存在类似的东西?
- 在我的应用程序中,我大量使用了异步,Catel 可以做到这一点吗?
- 我读到我可以用 SimpleInjector 替换 Catel 的默认 Ioc 提供程序...有人成功了吗?
谢谢
更新#1
模型说明
为简单起见,考虑一个类型为 Person 的对象,它将通过 Servicestack 从 Web 服务加载
[Alias("Person")]
public class Person
{
[Alias("NAME")]
public string Name {get;set;}
[Alias("SURNAME")]
public string Surname {get;set;}
}
这将作为 IList 返回,并可能加载到 GridView 中
现在用户想要编辑它,所以我将把这个人加载到另一个名为 UpdatePersonViewModel 的视图模型中(显示在弹出窗口中)
如果我没有像您在示例中那样实施它,我将无法使用 Catel 验证等,对吧?所以也许我必须创建一个将 Person 作为 Constructor 参数的 PersonModel,然后创建对象,对吗?
5.For SimpleInjector 我很久以前看过 this post
之后就开始使用它了
- 如果我必须对属性使用经典绑定,我是否必须对事件绑定使用命令?如果我有一个没有命令的用户控件怎么办?
在 Caliburn 中,我可以在表单中附加一条消息
cal:Message.Attach="[Event DataLoading] = "[Action Something($eventArgs)"] .
在Catel中我应该如何绑定那个事件??
- 不,Catel 可以使用任何模型。如果您建模实现 IEditableObject、INotifyPropertyChanged、IDataErrorInfo 等,您将免费获得一些便利
- 网格主要绑定到对象列表,您不应为每一行创建单独的视图模型以牢记性能
- Caliburn 是基于约定的,Catel 不是(对于绑定)。您应该使用常规绑定。
- 是的,"of course"
- 是的,但你应该问问自己为什么要这样做,是否要这样做。 Catel 为您开箱即用,只有在您有真正充分的理由时才会更改。
顺便说一句。您可能对 Orchestra 感兴趣,它是我们在 Catel 之上为 WPF 应用程序(NET 40 和 NET 45)构建的 shell,它包含许多不错的功能,例如完全可自定义的键盘快捷键、启动画面等)
对更新 #1 的回应
3.1:参见 EventToCommand 或 Catel 附带的许多其他行为和触发器。
基准测试非常好,但您应该牢记您实际做了多少。您可能最多每秒注入 2 / 3 个 vm,您不会注意到任何差异。但如果你真的想要,请查看 this documentation on how to replace the default components.
您仍然可以使用验证,但必须在您的视图模型中实现它。这对您的网格来说很复杂,因此最好创建一个可以自我验证的包装器。所以你确实可以创建一个 ValidatablePerson class 来验证这个人并包装它的属性(或者只实现验证)。可以使用 T4 模板轻松完成。
我正在评估将一个全新的项目从 Caliburn Micro 迁移到 Catel。 我想和你分享我的想法并得到你的反馈
让我们从我的应用程序结构开始:
- 基于MVVM的WPF应用
- Telerik 用户控制套件
- 使用 ServiceStack 从网络服务器检索数据
- 为 IoC 使用 SimpleInjector
- 用于日志记录的 NLog
- TCP/IP 连接到远程服务器
- FW 4.0 与 Microsoft.BCL.Async
- 应用程序类似于Visual Studio(对接)
现在结构几乎已经清楚了,我将从我的问题开始:
- 我的模型是通过 ServiceStack.OrmLite 填充的,所以它们是 属性 的 POCO 而不是依赖性 属性-like ,因为模型是在网络服务器和 WPF 部分共享的,我不我想从 ModelBase 继承,当数据到达 WPF 部分时,我是否必须重新创建从 ModelBase 继承的对象?
- RadGridView 中显示的数据绑定到模型 属性,据我所知 here,我必须将模型传递给 ViewModel 我如何绑定这些数据数据到网格或一般视图?
- 我发现在 CM the Convention 中非常有用,所以如果我将 TextBox 命名为 x:Name="Surname",它会查找 属性 Surname,在 Catel 中我应该这样做吗?或者是否存在类似的东西?
- 在我的应用程序中,我大量使用了异步,Catel 可以做到这一点吗?
- 我读到我可以用 SimpleInjector 替换 Catel 的默认 Ioc 提供程序...有人成功了吗?
谢谢
更新#1
模型说明
为简单起见,考虑一个类型为 Person 的对象,它将通过 Servicestack 从 Web 服务加载
[Alias("Person")]
public class Person
{
[Alias("NAME")]
public string Name {get;set;}
[Alias("SURNAME")]
public string Surname {get;set;}
}
这将作为 IList 返回,并可能加载到 GridView 中
现在用户想要编辑它,所以我将把这个人加载到另一个名为 UpdatePersonViewModel 的视图模型中(显示在弹出窗口中)
如果我没有像您在示例中那样实施它,我将无法使用 Catel 验证等,对吧?所以也许我必须创建一个将 Person 作为 Constructor 参数的 PersonModel,然后创建对象,对吗?
5.For SimpleInjector 我很久以前看过 this post
之后就开始使用它了- 如果我必须对属性使用经典绑定,我是否必须对事件绑定使用命令?如果我有一个没有命令的用户控件怎么办?
在 Caliburn 中,我可以在表单中附加一条消息
cal:Message.Attach="[Event DataLoading] = "[Action Something($eventArgs)"] .
在Catel中我应该如何绑定那个事件??
- 不,Catel 可以使用任何模型。如果您建模实现 IEditableObject、INotifyPropertyChanged、IDataErrorInfo 等,您将免费获得一些便利
- 网格主要绑定到对象列表,您不应为每一行创建单独的视图模型以牢记性能
- Caliburn 是基于约定的,Catel 不是(对于绑定)。您应该使用常规绑定。
- 是的,"of course"
- 是的,但你应该问问自己为什么要这样做,是否要这样做。 Catel 为您开箱即用,只有在您有真正充分的理由时才会更改。
顺便说一句。您可能对 Orchestra 感兴趣,它是我们在 Catel 之上为 WPF 应用程序(NET 40 和 NET 45)构建的 shell,它包含许多不错的功能,例如完全可自定义的键盘快捷键、启动画面等)
对更新 #1 的回应
3.1:参见 EventToCommand 或 Catel 附带的许多其他行为和触发器。
基准测试非常好,但您应该牢记您实际做了多少。您可能最多每秒注入 2 / 3 个 vm,您不会注意到任何差异。但如果你真的想要,请查看 this documentation on how to replace the default components.
您仍然可以使用验证,但必须在您的视图模型中实现它。这对您的网格来说很复杂,因此最好创建一个可以自我验证的包装器。所以你确实可以创建一个 ValidatablePerson class 来验证这个人并包装它的属性(或者只实现验证)。可以使用 T4 模板轻松完成。