【发布时间】:2012-03-15 14:36:54
【问题描述】:
我尝试在 OnActivate 方法中设置属于视图模型的所有控件的启用/可见性状态。到目前为止,这没有问题,但我不确定是否有更好的方法可以在不从视图模型访问视图的情况下执行此操作。
【问题讨论】:
标签: .net mvvm caliburn.micro
我尝试在 OnActivate 方法中设置属于视图模型的所有控件的启用/可见性状态。到目前为止,这没有问题,但我不确定是否有更好的方法可以在不从视图模型访问视图的情况下执行此操作。
【问题讨论】:
标签: .net mvvm caliburn.micro
是的,使用绑定。在 XAML 中,将 Visibility 属性设置为绑定到视图模型上的公共属性,并使用标准 BooleanToVisibilityConverter 将布尔视图模型公共属性转换为有效的 Visibility 值。
如果您希望创建一个通用解决方案以允许配置任何视图元素的可见性,那么一种选择是插入 Caliburn.Micro 绑定过程。例如,您可以将另一个元素添加到 ViewModelBinder.BindProperties 调用列表。
我没有对此进行测试,但这里是在您的引导程序的 Configure 方法中完成的:
protected override void Configure()
{
ViewModelBinder.BindProperties += (namedElements, viewModelType) =>
{
foreach (var element in namedElements)
{
// Generate a unique identifier for an element on a particular view
string uniqueElementId = string.Format("{0}.{1}", viewModelType.FullName, element.Name);
// Calculate the visibility of the element based on unique element id
bool elementVisible = ...
// Set the element's visibility
element.Visibility = elementVisible ? Visibility.Visible : Visibility.Collapsed;
}
};
... other configuration code
}
BindProperties public Func 获取视图上所有命名元素的集合,以及绑定到的视图模型的类型。您可以使用此信息来唯一标识每个视图控件,然后根据该唯一标识符从您的数据中计算可见性。
请注意,在这样的代码中设置每个元素的 Visibility 将覆盖 XAML 中 Visibility 属性上存在的任何绑定。
【讨论】:
我不知道你到底想通过这个实现什么。尽管如此,使用(和改变)视图的 VisualState 或 C.M.守卫方法可能会起作用。
【讨论】: