Wpf 为什么在混合键触发器中使用Caliburn操作会破坏我的观点?

Wpf 为什么在混合键触发器中使用Caliburn操作会破坏我的观点?,wpf,xaml,mvvm,caliburn.micro,wpf-4.0,Wpf,Xaml,Mvvm,Caliburn.micro,Wpf 4.0,Caliburn Micro 2.0.2和WPF 4以及.NET 4.5 使用一个非常简单的视图和一个非常简单的viewmodel来演示,我注意到如果我在一个KeyTrigger中有一个Caliburn操作,我的视图就不会被正确激活。当我说“正确”时,我的意思是如果我在Snoop中查看它,整个UserControl都被禁用。如果我将其更改为窗口并将其作为窗口而不是嵌入式控件打开,Snoop甚至找不到该窗口,并且该控件保持禁用状态 这是我的ViewModel: using System.Windo

Caliburn Micro 2.0.2和WPF 4以及.NET 4.5

使用一个非常简单的视图和一个非常简单的viewmodel来演示,我注意到如果我在一个KeyTrigger中有一个Caliburn操作,我的视图就不会被正确激活。当我说“正确”时,我的意思是如果我在Snoop中查看它,整个UserControl都被禁用。如果我将其更改为窗口并将其作为窗口而不是嵌入式控件打开,Snoop甚至找不到该窗口,并且该控件保持禁用状态

这是我的ViewModel:

using System.Windows.Input;
using Caliburn.Micro;

namespace PlainSailTech.ViewModels.Admin
{
    public class SystemConfigurationViewModel : Screen
    {
        private bool canShowDevLinks;

        public bool CanShowDevLinks
        {
            get { return canShowDevLinks; }
            set
            {
                if (value.Equals(canShowDevLinks)) return;
                canShowDevLinks = value;
            }
        }

        public void ShowDevLinks(KeyEventArgs args)
        {
            if (args != null)
                args.Handled = true;
            CanShowDevLinks = !CanShowDevLinks;
        }
    }
}
这是我的XAML:

<Window x:Class="PlainSailTech.Bookkeeping.Ui.Views.Admin.SystemConfigurationView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:cal="http://www.caliburnproject.org"
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
         xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
         mc:Ignorable="d" 
         Title="Caliburn Action test"
         d:DesignHeight="300" d:DesignWidth="300">
<i:Interaction.Triggers>
    <ei:KeyTrigger Modifiers="Ctrl" Key="D" FiredOn="KeyUp" ActiveOnFocus="True">
        <cal:ActionMessage MethodName="ShowDevLinks">
            <cal:Parameter Value="$eventArgs" />
        </cal:ActionMessage>
    </ei:KeyTrigger>
</i:Interaction.Triggers>
<Grid>
    <Grid Width="Auto">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid Grid.Row="0" Background="#FFFBFBFB" Visibility="{Binding CanShowDevLinks, Converter={StaticResource BoolToVisible}}">
            <TextBlock Text="Dev links here" />
        </Grid>
        <Grid Grid.Row="1">
            <TextBox VerticalAlignment="Top" IsReadOnly="False" IsEnabled="True" Width="150" Height="30">
                <TextBox.Style>
                    <Style TargetType="TextBox">
                        <Setter Property="Background" Value="Blue"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="Text" Value="Enabled"/>
                        <Style.Triggers>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Background" Value="Red"/>
                                <Setter Property="Foreground" Value="Black"/>
                                <Setter Property="Text" Value="Disabled"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </Grid>
    </Grid>
</Grid>
</Window>

请注意,文本框设置为enabled,但整个控件处于禁用状态。您可以从该屏幕截图中看到:

但是,如果我简单地删除Caliburn操作,一切又会好起来:

    <i:Interaction.Triggers>
    <ei:KeyTrigger Modifiers="Ctrl" Key="D" FiredOn="KeyUp" ActiveOnFocus="True">
    </ei:KeyTrigger>
</i:Interaction.Triggers>

一些可能的线索。如果:

如果我将Caliburn操作替换为:

 <ei:ChangePropertyAction TargetObject="{Binding Mode=OneWay}" PropertyName="CanShowDevLinks" Value="True">

或者我的ViewModel不从Screen或PropertyChangedBase继承

如果我覆盖OnViewAttached并为EnableChanged连接一个处理程序,我可以看到在附加视图后IsEnabled被设置为false


因此,它似乎是Screen/PropertyChangedBase基类中发生的任何事情与操作的连接之间的交互。

好的-这个问题的答案是问这个问题的人是个白痴。我有一个具有操作方法名称的guard属性。因为KeyTrigger位于UserControl之下,所以它禁用了整个过程。啊

例如,我知道在命名按钮时会应用guard属性,但我没有意识到它会应用于任何附加了动作的UI元素。你偶尔会生活和学习