我在 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/