在 Caliburn.Micro 中如何将操作绑定到嵌套的 ViewModel 方法?

2024-02-20

我有一个 WPF 应用程序,由 Caliburn.Micro 提供支持,视图模型优先方法。有一种命令栏类型的控件,其CommandBarView.xaml并绑定命令栏视图模型。命令栏虚拟机包含许多嵌套虚拟机,每个虚拟机对应一个按钮控件,所有虚拟机都显示通用界面并具有通用行为。命令栏虚拟机公开它们,以便可以从视图中绑定它们:

public interface IWarningButtonViewModel
{
    bool IsVisible { get; }
    bool CanShowWarning { get; }
    void ShowWarning();
}

public class CommandBarViewModel : PropertyChangedBase
{
    public IWarningButtonViewModel UserNotFoundWarning { get; private set; }
    public IWarningButtonViewModel NetworkProblemWarning { get; private set; }
    // ... initialization omitted for simplicity
}

这是 CommandBarView 的暂定 XAML:

<Button x:Name="UserNotFoundWarning_ShowWarning"
        IsEnabled="{Binding UserNotFoundWarning.CanShowWarning}">
  ... 
  <DataTrigger Binding="{Binding UserNotFoundWarning.IsVisible}" Value="True">
  ...
</Button>

通过这种方式,我能够成功绑定两个属性(可以显示警告, 可见)但我无法将按钮命令/操作绑定到显示警告 method.

我尝试过深度属性绑定 https://joshearl.wordpress.com/2011/03/24/deep-property-databinding-with-caliburn-micro/这同样适用于属性,但不适用于行动。
我也尝试过混合使用cal:Model.Bind and cal:Message.Attach:

<Button cal:Model.Bind="{Binding UserNotFoundWarning}" 
        cal:Message.Attach="[Event Click] = [Action ShowWarning]"
        IsEnabled="{Binding CanShowWarning}">
  ... 
  <DataTrigger Binding="{Binding IsVisible}" Value="True">
  ...
</Button>

这似乎在运行时有效,但是cal:模型.绑定使 VS 设计器完全无法使用,UI 控件不显示。

我已经搜索了很多,但我找不到一个实际的解决方案,让我也可以与设计师合作。对我来说,我只能找到属性深度绑定的示例,而不能找到操作的示例,这似乎很奇怪。

知道如何解决这个问题吗?


这是我的解决方法:

private static void EnableNestedViewModelActionBinding()
{
    var baseGetTargetMethod = ActionMessage.GetTargetMethod;
    ActionMessage.GetTargetMethod = (message, target) =>
    {
        var methodName = GetRealMethodName(message.MethodName, ref target);
        if (methodName == null)
            return null;

        var fakeMessage = new ActionMessage { MethodName = methodName };
        foreach (var p in message.Parameters)
            fakeMessage.Parameters.Add(p);
        return baseGetTargetMethod(fakeMessage, target);
    };

    var baseSetMethodBinding = ActionMessage.SetMethodBinding;
    ActionMessage.SetMethodBinding = context =>
    {
        baseSetMethodBinding(context);
        var target = context.Target;
        if (target != null)
        {
            GetRealMethodName(context.Message.MethodName, ref target);
            context.Target = target;
        }
    };
}

private static string GetRealMethodName(string methodName, ref object target)
{
    var parts = methodName.Split('.');
    var model = target;
    foreach (var propName in parts.Take(parts.Length - 1))
    {
        if (model == null)
            return null;

        var prop = model.GetType().GetPropertyCaseInsensitive(propName);
        if (prop == null || !prop.CanRead)
            return null;

        model = prop.GetValue(model);
    }
    target = model;
    return parts.Last();
}

Call EnableNestedViewModelActionBinding()一旦来自引导程序,它将允许您使用通常的点符号将操作绑定到嵌套模型的方法。例如。

cal:Message.Attach="[Event Click] = [Action UserNotFoundWarning.ShowWarning]"

Edit:请注意,如果您在运行时更改嵌套的 ViewModel 实例,这将不起作用。例如。如果你分配你的UserNotFoundWarning绑定发生后发生新的事情 - Caliburn 仍会调用前一个实例的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Caliburn.Micro 中如何将操作绑定到嵌套的 ViewModel 方法? 的相关文章

  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 唯一索引不适用于 Mongoose / MongoDB

    我在使用 Mongoose MongoDb 创建唯一索引时遇到问题 无法让它工作 当我设置唯一索引时 我可以添加两个具有相同属性值的文档 我已经尝试了我能想到的一切 重新启动 一切 更改语法等 Code Addtion gt gt 这是我用
  • MongoDB 如何评估多个 $or 语句?

    MongoDB 将如何评估此查询 db testCol find or a 1 b 12 b 9 c 15 c 10 d foo 当扫描文档中的值时 如果第一个 OR 语句为 TRUE 其他语句也会被评估吗 从逻辑上讲 如果 MongoDB
  • 如何防止 UIButton 在按下时突出显示?

    When an UIButton按下后 正常情况是它会突出显示 即阴影层会覆盖图像 有没有办法防止这种情况发生 有没有一个属性可以处理这个问题 通常 您不会使用 Xcode 按按钮 而是使用手指 或鼠标 但撇开挑剔不谈 adjustsIma
  • 使用 JQuery Mobile 向上或向下移动控制组中的多个链接

    这是我上一个问题的后续问题 控制组 JQuery Mobile 上有 3 个水平按钮 多行 https stackoverflow com questions 26088729 controlgroup 3 buttons horizont
  • 使用 JS 在 Google Apps 脚本文档中查找未知字符串并将其更改为大写

    我写在Fountain markdown http fountain io http fountain io 在谷歌文档中 喷泉是用来写剧本的 我想通过自动大写某些元素 打开或使用按钮等 使喷泉中的书写更加友好 这是一个格式正确的剧本 在喷
  • 哪个 django OpenID 库可与新的 Google OpenID 配合使用

    由于 Google 弃用了 OpenID 2 0https developers google com accounts docs OpenID2 https developers google com accounts docs Open
  • 如何使符号计算中的所有低值都变为零?

    如何将 SymPy 表达式中的所有低值设为零 例如我的结果是 1 0 a1 cos q1 6 12e 17 a2 sin q2 a3 sin q2 q3 a4 sin q2 q3 q4 sin q1 1 0 a2 cos q2 a3 cos
  • Python中计算二叉树的深度

    我是编程新手 正在尝试计算 Python 中二叉树的深度 我相信我的错误是因为深度是 Node 类的方法而不是常规函数 我正在尝试学习OOP并希望使用一种方法 这可能是一个新手错误 这是我的代码 class Node def init se
  • OpenCL 在线编译:从 cl::program 或 cl::kernel 获取程序集

    我正在使用 OpenCL 运行内核基准测试 我知道我可以使用 OpenCL 供应商提供的各种工具离线编译内核 即ioc64 or poclcc 问题是我得到的性能结果无法用这些工具的汇编 OpenCL 运行时开销或类似的来解释 我想看到由我
  • 我无法删除 Azure AD 门户中的本机应用程序注册

    我只想删除出于测试目的而创建的 AD 应用程序注册 我无法删除它 因为删除按钮呈灰色 在我删除另一个未使用的应用程序之前没有任何问题 有什么建议么 游戏有点晚了 但是当尝试上述步骤时 它们对我不起作用 总是被禁用 并且由于某种原因 我无法将
  • 整个计算机处于 Git 状态未跟踪文件

    我是 git 新手 我想我不小心克隆到了根目录中 当我提交一个文件 index html 时 我注意到我的整个计算机 我的桌面 我的文档等 都在未跟踪的文件中 我删除了存储库 并且想删除所有未跟踪的文件 显然不想删除计 算机中的所有内容 我
  • 在 Safari 中打开 WebView 链接

    我正在 Cocoa 中开发一个应用程序 我想知道是否有一种方法 如何使我的 webview 中单击的任何链接在 Safari 或默认浏览器 中启动 提前致谢 我自己刚刚遇到了这个问题 并通过以下方式解决了它 我的主控制器对象被设置为 Web
  • 捕获 C++ 库崩溃的一致方法

    我浏览了不同的网站 除了那些似乎不起作用的网站之外 找不到这个问题的任何答案 正如标题所示 我正在尝试找到一种方法来捕获我正在处理的库是否崩溃 我有一个 Root 类 它保存我的库中的许多管理器样式类的实例 并在其析构函数中释放这些实例 当
  • 在reactjs中悬停时显示组件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我创建了几个带有特定内容标题的部分 我想在悬停在不同部分上方时显示一个简短的预览 有谁知道如何创建一个具有条件渲染反应组件的hover
  • 冒泡排序双向链表

    我的双向链表冒泡排序功能有问题 当我以单链接方式对节点进行排序时 仅使用 gt next 它可以工作 但我无法使其与 gt prev 指针一起使用 这是我正在使用的代码 void sort int count struct data tmp
  • 无法更新 Dynamodb 表,出现 ValidationException

    我需要仅使用分区键来更新我的 dynamodb 表 但我得到了验证异常 我创建了一个包含 3 个字段的表 id 分区键 名称 排序键 age 然后我尝试仅使用 id 更新年龄字段 尝试将年龄 30 修改为 40 这是我的代码 var AWS
  • 如何调试 gulp-sourcemaps 不执行任何操作?

    我有一个相当标准的用例gulp sourcemaps https github com floridoo gulp sourcemaps https github com floridoo gulp sourcemaps gulp src
  • SQLAlchemy 获取匹配查询的每一行并循环遍历它们

    我是 Python 和 SQLAlchemy 的新手 我一直在尝试从数据库中检索内容 并且每次都有效 但我有点不确定当 select 语句将返回多行时该怎么做 我尝试使用一些在开始 SQLAlchemy 之前有效的旧代码 但是db是一个 S
  • Google PHP API 客户端:CA 证书错误

    我正在尝试与 Google PHP API 客户端交互 但 Google 提供的证书存在问题 谷歌错误 SSL certificate problem verify that the CA cert is OK Retrying with
  • 在 Caliburn.Micro 中如何将操作绑定到嵌套的 ViewModel 方法?

    我有一个 WPF 应用程序 由 Caliburn Micro 提供支持 视图模型优先方法 有一种命令栏类型的控件 其CommandBarView xaml并绑定命令栏视图模型 命令栏虚拟机包含许多嵌套虚拟机 每个虚拟机对应一个按钮控件 所有