WPF Event to Command的另一种实现(有问题)

2023-11-30

我正在研究将 ICommand 挂接到控件事件的各种实现。因此,例如,文本框的 GotFocus 应该在我的视图模型中调用 GotFocusCommand。然后我想到了实现我自己的版本(用于我自己的学习)并且它运行良好,但我只能将一个事件链接到 XAML 中的一个命令。

(基本上我只是使用反射来查找指定的事件,然后执行执行命令的 AddEventHandler )

这工作正常:

<Button 
  local:EventToCommand.Event="Click" 
  local:EventToCommand.Command="{Binding TestCommand}" 
  />  

但这并不:

<Button 
  local:EventToCommand.Event="Click" 
  local:EventToCommand.Command="{Binding ClickCommand}" 
  local:EventToCommand.Event="GotFocus" 
  local:EventToCommand.Command="{Binding GotFocusCommand}"
  />  

正如您所说,它会导致重复的属性名称错误。

是否可以做类似的事情:

<Button>
  <Some Xaml Element>
    <local:EventToCommand Event="Click" Command="{Binding ClickCommand}" />
    <local:EventToCommand Event="GotFocus" Command="{Binding GotFocusCommand}" />
  </Some Xaml Element>
</Button>

将多个事件“映射”到命令?


有几种方法可以解决此问题,可以使用附加属性,也可以从 Button 继承并添加您自己的包含 EventToCommand 对象列表的 DependencyProperty,然后在添加到该集合时将事件连接到命令。如果这看起来令人困惑,我可以尝试举一些例子。

C#

    public class EventedButton : Button
{
    public static DependencyProperty EventCommandsProperty
        = DependencyProperty.Register("EventCommands", typeof(EventToCommandCollection), typeof(EventedButton), new PropertyMetadata(null));


    public EventToCommandCollection EventCommands
    {
        get
        {
            return this.GetValue(EventCommandsProperty) as EventToCommandCollection;
        }
        set
        {
            this.SetValue(EventCommandsProperty, value);
        }
    }

    public EventedButton()
    {
        this.EventCommands = new EventToCommandCollection(this);
    }
}

Xaml:

    <local:EventedButton>
        <local:EventedButton.EventCommands>
            <local:EventToCommand />
        </local:EventedButton.EventCommands>
    </local:EventedButton>

在 EventToCommandCollection 内部,当项目添加到集合中时,您可以附加/分离到所需的事件。

更新:附加财产

以下是一些将集合作为附加属性执行的代码:

C#

        public static DependencyProperty CommandsProperty =
        DependencyProperty.RegisterAttached(
        "Commands",
        typeof(ICollection<EventToCommand>),
        typeof(DependencyObject),
        new PropertyMetadata(null, OnCommandsChanged));


    private static void OnCommandsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // Attach/Detach event handlers
    }

    public static void SetCommands(DependencyObject element, ICollection<EventToCommand> value)
    {
        element.SetValue(CommandsProperty, value);
    }

    public static ICollection<EventToCommand> GetCommands(DependencyObject element)
    {
        return (ICollection<EventToCommand>)element.GetValue(CommandsProperty);
    }

Xaml:

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

WPF Event to Command的另一种实现(有问题) 的相关文章

  • 使用 jquery 事件 keydown 模拟在文本区域上输入不起作用

    我正在尝试制作 Facebook 自动回复消息脚本 这是我的代码 window load function var a setInterval function var e titlebarText html if e else texta
  • 将多个实时视频流拉入 WPF

    我想创建一个应用程序 将由同轴电缆 hdmi 或其他标准提供的多个实时视频源拉入 WPF 中进行操作 即应用一些转换或像素着色器 然后将其输出到监视器 开始使用这个应用程序时我会考虑什么 有没有任何硬件可以让事情变得更容易 如果您通过同轴电
  • WPF 中处理系统关闭

    如何在 WPF 中重写 WndProc 当我的窗口关闭时 我尝试检查我正在使用的文件是否被修改 如果是 我必须提示用户 你想保存更改吗 消息 然后关闭正在使用的文件和窗口 但是 当我的窗口仍然打开时 我无法处理用户重新启动 关闭 注销的情况
  • 将 MahApps 图标与 ContextMenu 结合使用

    我正在使用 MahApps Metro UI 工具包编写 WPF 应用程序 http mahapps com guides quick start html http mahapps com guides quick start html
  • Windows 8 Windows 应用商店应用程序中的中继命令

    由于 CommandManager 在 win8 Metro 应用程序中不可用 是否有 RelayCommand 的版本 有一个版本here https xp dev com svn mytoolkit Shared MVVM RelayC
  • 覆盖页面范围内的主题资源

    我想覆盖主题资源 特别是SystemAccentColor 在特定页面的范围内 我已经在广泛的应用范围内成功地做到了这一点 但我无法针对特定页面执行此操作 App xaml 中的 XAML 效果很好
  • 如何使用 MVVM 打开和关闭新 Windows?

    对于 MVVM 和 WPF 什么是处理打开和关闭新窗口和对话框的好 直接方法 打开和关闭应该由 ViewModel 驱动 对吗 但 ViewModel 不应该知道视图 我通常为此使用接口 例如 如果我想在单独的窗口中编辑记录 我有一个接口
  • 增加 WPF 弹出动画的持续时间

    我有一个 WPF PopUp 控件 用于显示菜单叠加层 并且使用默认的淡入淡出动画 不过我想让动画需要更长的时间才能完成 我可以在 XAML 中做到这一点吗 你能在这里发布相关的xaml代码吗 否则 您可以查看这些链接以开始使用 xaml
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 如何调试symfony2服务容器中配置的标签和服务?

    我正在编写一个服务来处理 AccessDeniedException 并且我找到了一种方法来解决它使用 Symfony2 的 AccessDeniedHandlerInterface https stackoverflow com ques
  • 在哪里可以找到 WPF 应用程序中 UI 的一些主题/演示?

    我想使用 xaml 中的 Visual Studio Designer 设计一个现代外观的 UI 它为我提供了一个很好的工具箱 我可以使用它通过拖放来直观地创建 UI 由于它几乎表现得像 HTML 我想知道它是否也有丰富的主题库 我找到了一
  • 如何更改 OxyPlot Y 轴字符串格式?

    谁能告诉我如何更改 Y 轴字符串格式 我想向 Y 轴百分比添加百分号 我正在使用 OxyPlot 在 wpf 中生成图表 这是我的尝试 但它不起作用 Func
  • 实体框架 - 绑定 WPF 树视图控件

    在服务类别表中 ParentCategoryId 是 ServiceCategoryId 它是父类别 我的类别可以有第 n 级层次结构 因此我需要使用树视图控件来呈现它 我怎样才能做到这一点 Thanks 你可以使用分层数据模板 http
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 从固定文档中删除页面?

    如何从固定文档中删除页面 我添加这样的页面 Add page to pageContent PageContent pageContent new PageContent IAddChild pageContent AddChild fix
  • 调用线程无法访问该对象,因为另一个线程拥有它

    我已经阅读了很多关于此错误的帖子 但我不明白如何在我的解决方案中解决它 我有一个进度条对话框 其中包含一些逻辑 通过按钮单击从 MainFrame 调用 void OnBtnClick object sender RoutedEventAr
  • WPF 错误:属性元素不能位于元素内容的中间。它们必须位于内容之前或之后

    我有一个MergedDictionaries and DateTemplate里面一个ResourceDictionary一切都很好 直到我添加了一个Converter
  • 如何将文本放在 RadioButton 的顶部

    我正在尝试实现附件中显示的效果 但没有成功 甚至有可能吗 我试图将文本框放在单选按钮内 并将其设置为水平和垂直内容对齐 但它没有按我想要的方式工作 欢迎任何建议 Resource
  • XAML 构建的本地 TFS 到 VSTS 迁移

    目前 我们在本地使用 TFS 2017 update 1 但我们必须在 VSTS 云平台上迁移 TFS 此外 我们还使用自定义构建模板在本地使用 TFS 构建服务器进行 XAML 构建 我们的问题是迁移后所有 XAML 构建定义是否都能正常
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange

随机推荐