ICommand 类型的 WPF 附加属性

Posted

技术标签:

【中文标题】ICommand 类型的 WPF 附加属性【英文标题】:WPF Attached Property of type ICommand 【发布时间】:2021-12-27 21:20:04 【问题描述】:

我想为按钮实现一个新的附加属性,如果鼠标悬停则注册,如果是则执行命令。 这是 C# 代码:

public class MouseMovement 
    

     
        public static readonly DependencyProperty MouseOverCommandProperty =
            DependencyProperty.RegisterAttached("MouseOverCommand", typeof(ICommand), typeof(MouseMovement), 
                new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseOverCommandChanged)));




       

        private static void MouseOverCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        
            FrameworkElement element = (FrameworkElement)d;
            element.MouseEnter += new MouseEventHandler(element_MouseOver);
        

        private static void element_MouseOver(object sender, MouseEventArgs e)
        
            FrameworkElement element = (FrameworkElement)sender;
            ICommand cmd = GetMouseOverCommand(element);
            cmd.Execute(e);
        

        public static void SetMouseOverCommand(UIElement element, ICommand value)
        
            element.SetValue(MouseOverCommandProperty, value);
        

        private static ICommand GetMouseOverCommand(FrameworkElement element)
        
            return (ICommand)element.GetValue(MouseOverCommandProperty);
        

还有 xaml:

<Button mouseEvents:MouseMovement.MouseOverCommand="Binding ButtonMouseOverCommand"  Grid.Row="0" Background="Transparent" BorderThickness="0" >
                <StackPanel>
                    <Image />
                    <TextBlock Text="BL-Invoices" Foreground="White"/>
                </StackPanel>
            </Button>

每次我尝试运行它时都会收到错误消息:“无法为按钮类型的属性“SetMouseOverCommand”指定绑定。只能为 DependencyObject 的 DependencyProperty 指定绑定”

我在这一点上有点卡住了,也许你有一些想法。

编辑:正如接受的答案中所述,错误是一个错字。 AttachedProperty 名称设置为“MouveOverCommand”而不是“MouseOverCommand”。我将代码 sn-p 编辑为正确。

【问题讨论】:

制作 GetMouseOverCommand public 同意应该公开,但仍然不是最终的解决方案。例外仍然存在。 'GetMouseOverCommand' 中的元素也应该是 UIElement,但这仍然没有区别。 您应该改用行为 (Windows.Interactivity)。 @DerrickMoeller 有时最好重新阅读你写的东西。不过,谢谢! @Leandro 谢谢我去看看。 【参考方案1】:

看起来只是一个错字,我将您的代码放入示例项目中,它按预期工作。

public static readonly DependencyProperty MouseOverCommandProperty =
        DependencyProperty.RegisterAttached("MouseOverCommand", typeof(ICommand), typeof(MouseMovement), 
            new FrameworkPropertyMetadata(new PropertyChangedCallback(MouseOverCommandChanged)));

【讨论】:

以上是关于ICommand 类型的 WPF 附加属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM--事件绑定

WPF MVVM--事件绑定

WPF MVVM--事件绑定

WPF属性附加属性

2022-03-23 WPF面试题 WPF中的命令设计模式和ICommand是什么?

2022-03-23 WPF面试题 WPF中的命令设计模式和ICommand是什么?