c# - Caliburn Micro WPF : Message. Attach with guard 属性禁用整个主机控制

标签 c# wpf caliburn.micro

我在 WPF 应用程序中使用 Caliburn.Micro(2.0.2,目前是最新版本)。假设我有一个简单的项目列表,我想对所选项目启用一些操作。该操作绑定(bind)到一个按钮。

因此,我的 VM 公开了这些项目的可绑定(bind)集合(例如 Persons),以及绑定(bind)到所选项目的相同类型的对象(例如 SelectedPerson)。假设该操作对应于名为 Test 的方法,并且我有一个保护属性 CanTest,当所选项目不为 null 时返回 true。当 SelectedPerson 发生变化时,我也会为 CanTest 调用 NotifyOfPropertyChanged

这个简单的场景工作正常:当没有选择任何东西时,与我的操作对应的按钮被禁用;当我选择任何项目时,它会被启用。

当我使用 Message.Attach 将方法绑定(bind)到控件事件时出现问题:假设我想将它附加到鼠标双击。我的 XAML 将如下所示:

<ListBox ItemsSource="{Binding Path=Persons,Mode=OneWay}"
         SelectedItem="{Binding Path=SelectedPerson,Mode=TwoWay}"
         cal:Message.Attach="[Event MouseDoubleClick] = [Action Test]"/>

这会完全禁用该控件(整个控件,不仅是后代按钮,因此我永远无法在 ListBox 中选择一个项目,它永远处于禁用状态)。我必须启用它的唯一方法是从我的 VM 中删除 guard 属性(或从 View 中删除 Message.Attach)。

您可以在 http://1drv.ms/1OTSgq2 找到一个简单的重现。 .

我还在 https://caliburnmicro.codeplex.com/discussions/246571 找到了这篇文章,这似乎表明附加消息会禁用守卫属性的基于约定的逻辑,因此您必须将控件的 IsEnabled 属性显式绑定(bind)到您的守卫属性。我试过了,但没有任何变化。

最佳答案

由于 Caliburn 的约定,在您的情况下,我建议仅将 CanTest 的属性名称更改为类似 IsTestEnabled 的名称。

关于c# - Caliburn Micro WPF : Message. Attach with guard 属性禁用整个主机控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875047/

相关文章:

c# - XAML 中的数据绑定(bind)资源文件

c# - Caliburn.Micro-OnDeactivate不触发

c# - 如何从C#中的日期计算一天的开始和结束

c# - c#中初始化集合类似于Java匿名类语法

wpf - UI 自动化和 TabControl

c# - Caliburn.Micro:从 IResult 中的异常中恢复

c# - WPF MVVM : Call method from control from inside attached usercontrol

c# - "Upload"使用jQuery上传文件不点击

c# - 如何在 Orchard CMS 模块中连接到 Global.asax 提供的标准事件?

c# - 开发向导 UI - WPF