为什么 DataBinding 没有传播到 UserControl

2024-04-22

今天早上我问了一个问题here https://stackoverflow.com/questions/39835222/command-binding-is-not-propagating-for-control-into-a-datatemplate-of-itemtempla?noredirect=1#comment66965701_39835222做一个简单的工作示例给了我与预期不同的行为。

完整工作样本位于GitHub https://github.com/EricOuellet2/CommandRoutingIntoItemTemplate。主要部分代码如下。

在本例中,命令永远不会传播到任何 UserControl,无论 UserControl 直接用作 Window 的子项。如果将 UserControl 用作 ListBox ItemTemplate 的 DataTemplate,它也不起作用。

我还包括一个 hack 按钮来解决命令到达用户控件的问题。黑客来自堆栈溢出 https://stackoverflow.com/questions/24099274/menuitem-in-window-commandbinding-in-usercontrol.

但是使用这个 hack 并不能解释为什么 UserControl 没有收到命令(没有它),并且使用这个 hack 也打破了良好编码的第一条规则:“高内聚和低耦合”。应该在窗口代码中使用 hack,以便它能够管理 UserControl 中的命令,我的想法是默认情况下应该发生这种情况。

为什么命令默认情况下不传播到 UserControl,我应该如何做才能以干净的方式将命令传播到 UserControl?

注意:在 UserControl 中仅使用一个 CommandBinding(删除其中一个)并不能解决问题。

部分代码:

<Window x:Class="CommandRoutingIntoItemTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CommandRoutingIntoItemTemplate"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>

        <local:UserControlTest></local:UserControlTest>

        <ListBox Grid.Row="1">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Aqua" BorderThickness="2">
                        <local:UserControlTest></local:UserControlTest>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>

            <ListBox.Items>
                <system:String>1</system:String>
                <system:String>2</system:String>
            </ListBox.Items>
        </ListBox>

        <StackPanel Grid.Row="2" Orientation="Horizontal">
            <Button Command="local:Commands.CommandTest">Put focus on TestBlock and click here to see if command occurs</Button>
            <Button Click="AddHack">Hack</Button>
        </StackPanel>
    </Grid>
</Window>

用户控制:

<UserControl x:Class="CommandRoutingIntoItemTemplate.UserControlTest"
             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:local="clr-namespace:CommandRoutingIntoItemTemplate"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.CommandBindings>
        <CommandBinding Command="local:Commands.CommandTest" CanExecute="CommandTestCanExecuteUserControl" Executed="CommandTestExecuteUserControl"></CommandBinding>
    </UserControl.CommandBindings>
    <Grid>
        <TextBox Text="UserControlTest">
            <TextBox.CommandBindings>
                <CommandBinding Command="local:Commands.CommandTest" CanExecute="CommandTestCanExecuteTextBox" Executed="CommandTestExecuteTextBox"></CommandBinding>
            </TextBox.CommandBindings>
        </TextBox>
    </Grid>
</UserControl>

您没有在用户控件上调用命令的原因是您的按钮不在单独的焦点范围内。为了使 WPF 正确拾取命令目标的焦点元素,它需要位于与命令调用控件不同的焦点范围内。

框架只会从按钮向上遍历视觉树,在其焦点范围内查找命令绑定(在您的情况下,它不会找到任何命令绑定)。当框架在当前焦点范围内找不到任何命令绑定时,它才会查找焦点元素的父焦点范围(在您的情况下,按钮位于Window焦点范围没有父范围,因此搜索将在那里结束)。

简单设定FocusManager.IsFocusScope="True"在你的StackPanel将解决该问题。

您还可以指定CommandTarget按钮上的属性指向您的用户控件而不依赖于焦点。

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

为什么 DataBinding 没有传播到 UserControl 的相关文章

  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 以编程方式使用自定义元素创建网格

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

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 使用 Google Cloud Functions 实现微服务的 API 网关

    Inputs 例如 我们有一些服务 账户服务 产品服务 支付服务 每项服务都是一个单独的 Google Cloud Function 每个服务都有自己的 HTTP API 例如 账户服务有 https REGION FUNCTIONS PR
  • 完全丢失:Django Rest Framework 中的序列化器和更新的多对多

    我已经研究这个问题几个小时了 但没有找到解决方案 我只是不明白 我有一个有很多孩子的父母 我创建了一个视图 允许我获取父级的所有子级 现在我想结束该列表 并使用新的子列表对父列表进行 PATCH 我明白我需要写一个自定义update方法 但
  • 如何在Python中按扩展名删除文件?

    我只是想制作一个通过 zip 扩展名删除项目的脚本 import sys import os from os import listdir test os listdir Users ben downloads for item in te
  • 检测跨域弹窗何时关闭

    我有一个 JavaScript 应用程序 位于domainA com 上 为了验证用户身份并设置 cookie 它会在 domainB com 上打开一个弹出窗口 这类似于 Twitter 的 anywhere 如何检测domainB co
  • 如何在 R 中绘制更平滑的曲线

    Using R 我画了一个阴影图 如果您看到曲线 它们并不平滑 如何让它们变得光滑 即使是 Excel 也能绘制出更加平滑的曲线 设备功能 Windows 7 屏幕分辨率 1366 x 768 最大 这是情节 以下代码用于绘制绘图 plot
  • 删除前 n 个单词并计数

    我有一个数据框对于文本列 我需要忽略或消除前 2 个单词并计算该列中的字符串数量 b lt data frame text c hello sunitha what can I do for you hi john what can I d
  • 从 std::heap 中间删除一个元素

    我使用优先级队列作为调度程序 但有一个额外的要求 我需要能够取消预定的项目 这相当于从优先级队列中间删除一个项目 我不能使用std priority queue因为对除顶部之外的任何元素的访问都受到保护 我正在尝试使用algorithm的堆
  • python 单元测试中的 Neo4j 临时数据库

    我正在尝试为将与 Neo4j 图形数据库交互的 python 项目创建单元测试 目前 我正在实现嵌入式图形数据库 但如果我选择将其部署到 Web 应用程序 我可能会迁移到 REST 接口 我已经安装了嵌入式 neo4j v1 9rc2pro
  • BeautifulSoup:AttributeError:“NavigableString”对象没有属性“name”

    你知道为什么 BeautifulSoup 教程中的第一个例子吗http www crummy com software BeautifulSoup documentation html QuickStart http www crummy
  • 将 WatiN 连接到 Firefox

    使用 WatiN 我面临一些问题 FireFox FF new FireFox http www google com FireFox 总是在此时崩溃 VS 报告 无法从传输中读取数据 连接 现有连接是 被远程主机强行关闭 知道为什么会发生
  • 获取剑道网格中的点击事件

    我正在尝试获取 Kendo Grid 的单击事件 以便我可以将内容绑定到 Shift 和 Ctrl 单击 我无法使用 Kendo 提供的固有多选功能 因为它不支持拖放 当我在 dataBound 事件之后创建函数时 我的函数会在单击时被调用
  • 当绘制的数据发生更改时,在 R 中更新绘图,无需重新创建小部件

    每次 R 在闪亮 或仅在 R 中创建一个绘图对象时 该小部件都会完全重新创建 对于小数据集 这不是问题 但我正在处理包含数千个散点的绘图 这使得在我的闪亮应用程序中重新创建绘图需要 10 20 秒 我正在寻找一种通过 JavaScript
  • 从 IIS 7/8 中的静态内容中删除服务器标头

    为了使我们的 API 和网站更加安全 我将删除那些泄露网站运行信息的标头 剥离标头之前的示例 HTTP 1 1 500 Internal Server Error Cache Control private Content Type tex
  • 使用 $.ajax 或 $.post 调用 MVC 5 控制器方法

    我正在尝试使用 JavaScript 设置从 MVC 页面到控制器的非常简单的调用 这是我的控制器 Imports System Web Mvc Namespace Controllers Public Class DataControll
  • 如何在 LaunchStoryboard 中显示 CFBundleShortVersionString?

    有没有办法在我的 LaunchStoryboard 中将 CFBundleShortVersionString 显示为 UILabel 文本 而无需在每次递增时手动输入它 我知道如何在代码中执行此操作 但在显示 LaunchStoryboa
  • 如何在 PHP CLI 中检测 STDOUT 重定向?

    我有一个 PHP CLI 脚本 它使用 shell 转义序列进行粗体显示 但我希望能够在脚本重定向 例如重定向到日志文件 时自动禁用这些序列 到目前为止 我可以找到在除 PHP 之外的所有内容中检测 STDOUT 重定向的方法 所以有人可以
  • Rmarkdown 到 Word 输出 - 在标题上方插入图像

    我有一个 Rmarkdown 文档 我正在将其输出到 Word 并且我正在尝试将公司徽标插入到页面顶部 位于包含标题和作者的标题上方 我还没有找到解决这个问题的办法 我尝试过使用pandoc args to include in heade
  • 更改 NuGet 包位置文件夹

    我想改变NuGet包文件夹 但它不会改变它 我所做的是创建文件nuget config
  • Java Try 和 Catch IOException 必须被捕获或声明为抛出

    我正在尝试使用我在底部找到的一些代码这一页 https stackoverflow com questions 453018 number of lines in a file in java 这是我为其创建的类中的代码 import ja
  • 为什么 DataBinding 没有传播到 UserControl

    今天早上我问了一个问题here https stackoverflow com questions 39835222 command binding is not propagating for control into a datatem