【问题标题】:Caliburn.Micro set status of controlsCaliburn.Micro 设置控件的状态
【发布时间】:2012-03-15 14:36:54
【问题描述】:

我尝试在 OnActivate 方法中设置属于视图模型的所有控件的启用/可见性状态。到目前为止,这没有问题,但我不确定是否有更好的方法可以在不从视图模型访问视图的情况下执行此操作。

【问题讨论】:

    标签: .net mvvm caliburn.micro


    【解决方案1】:

    是的,使用绑定。在 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 属性上存在的任何绑定。

    【讨论】:

    • 这意味着我必须为每个窗口创建绑定。我想有一个通用的方法,我只需扩展 Screen 类来执行我的自定义代码。例如,用户有一个文本文件,他在其中编写了类似 Window.control.property = false 的内容,并且应用程序使用此信息来设置值。所以我不想为所有东西创建一个像 IsVisible 这样的属性并手动绑定它(或告诉 caliburn 为我绑定它)。
    • 对不起,我已经读了 5 遍了,但我仍然不确定你的意思。您是说您需要最终用户可配置的每个控件的可见性吗?听起来很可怕,你确定这是你想要的吗?
    • 它应该可以从超级用户(在数据库内部)进行配置。因此,应用程序将检查数据库内部的证券并设置控件的可见性/启用状态。这些按钮/字段背后的功能始终在服务器上,因此这不是真正的安全检查,而只是一种避免 UI 中出现大量无用内容的方法。
    • 假设您可以找到一种机制来唯一地标识特定视图上的控件,并将其与数据库中的列值相关联,那么您最好尝试将您的逻辑集成到 Caliburn 中。微绑定过程,而不是尝试实现自定义屏幕类型。换句话说,Caliburn.Micro 为其绑定过程的每个步骤公开了公共 Func 委托实例。您可以插入适当的步骤并在那里执行您的自定义逻辑。
    • 这听起来很有趣。你有这样做的例子吗(我刚从 Caliburn.Micro 开始)。
    【解决方案2】:

    我不知道你到底想通过这个实现什么。尽管如此,使用(和改变)视图的 VisualState 或 C.M.守卫方法可能会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2019-09-07
      相关资源
      最近更新 更多