混合行为 - 你可以绑定到它们的属性吗?

2023-11-25

我目前正在将我创建的许多附加行为迁移到混合行为,以便它们支持在 Expression Blend 中进行拖放。我注意到混合行为的作者倾向于将行为属性定义为依赖属性。

我创造了一种行为,TiltBehaviour,它公开了公共依赖属性,TiltFactor,双精度类型。在 Expression Blend 中,我可以设置此属性的值,但是,添加“数据绑定...”的选项呈灰色显示:

cannot bind to behaviour property

我还注意到行为延伸DependencyObject,因此他们没有DataContext因此不能继承DataContext它们所附着的元素。这对我来说真是一个弱点!

因此,底线是,如果我无法在 Blend 中设置对我的行为依赖属性的绑定,并且它不继承DataContext,为什么要费心使用依赖属性呢?我可以只使用 CLR 属性。


除非支持绑定,否则混合行为几乎毫无用处!我重新创建了您的倾斜行为,它支持在 Blend 4 中绑定,没有任何问题,所以我不知道您到底哪里出了问题。也许您可以重现我的简单示例,然后推断您的设置出了什么问题。

这是具有依赖属性的(非功能性)倾斜行为:

public class TiltBehavior : Behavior<FrameworkElement>
{
    public double TiltFactor
    {
        get { return (double)GetValue(TiltFactorProperty); }
        set { SetValue(TiltFactorProperty, value); }
    }

    public static readonly DependencyProperty TiltFactorProperty =
        DependencyProperty.Register("TiltFactor", typeof(double), typeof(TiltBehavior), new UIPropertyMetadata(0.0));
}

然后只需创建一个新窗口并将行为放到网格上,Blend 就会创建以下内容:

<Grid>
    <i:Interaction.Behaviors>
        <local:TiltBehavior/>
    </i:Interaction.Behaviors>
</Grid>

属性选项卡中提供了 Blend“数据绑定...”选项。

我使用 WPF 和 Silverlight 项目对此进行了测试。内置行为、触发器和操作都通过使用依赖属性来支持绑定,并且所有 Blend 示例都大量使用绑定,因此这has上班。

事实上,你可以删除一个内置行为,例如FluidMoveBehavior到你的网格并检查Duration是一个依赖属性,支持绑定。如果这不起作用,我有no知道发生了什么事!


让我们考虑一下绑定是如何作用于这些被称为行为的奇怪野兽的。

作为 WPF 或 Silverlight 程序员,我们非常熟悉诸如此类的绑定FrameworkElement。它有一个属性叫做DataContext我们可以操纵它来控制默认绑定源,并且当我们使用该属性时,嵌套元素会继承该属性don't覆盖它。

但行为(以及触发因素和行动)是not类型的FrameworkElement。它们最终源自DependencyObject,正如我们所期望的那样。但是虽然我们可以使用绑定any类派生自DependencyObject,我们熟悉的DataContext在这个低级别缺少,因此绑定必须提供源。That's不是很方便。

所以行为是从(无论如何在 WPF 上)派生的Animatable and Animatable源自Freezable. The Freezable类是依赖对象的简单性与框架元素的复杂性交叉的地方。这Freezable类也是更熟悉的东西(例如画笔和图像源)的基类。这些类不需要框架元素的全部复杂性,但它们想要参与有限的方式以及与它们相关的元素。

经过复杂的神奇过程,Freezable实例获取继承上下文:与它们最密切相关的框架元素,并且当使用默认绑定(没有源的绑定)时,Freezable使用DataContext而是它的关联元素。

事实上,当你了解行为时AssociatedObject是一个中心概念;对于行为来说,它是该行为所依附的事物。但重要的一点是,所有Freezable对象可以使用DataContext他们的AssociatedObject通过代理。

所有这些魔法是什么乔什·史密斯调用:

  • 希尔伯格冻结技巧

所以所有这一切都导致说由于希尔伯格冻结技巧,混合行为支持使用其关联元素的数据上下文作为默认源进行绑定。因此,行为绑定似乎“正常工作”,无需我们付出任何努力。因此,行为的用处要大一千倍。

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

混合行为 - 你可以绑定到它们的属性吗? 的相关文章

  • 如何循环访问 WPF StackPanel 静态项目?

    可能很容易 但我很难弄清楚这一点 谷歌似乎也没有多大帮助 如何循环遍历 StackPanel 的静态声明元素 无数据绑定 元素在 xaml 中声明 任何帮助表示赞赏 你的意思是StackPanel的孩子们 foreach var child
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • 带有 ObservableCollection 和动态过滤器的 Silverlight ListBox

    假设我有这门课 public class MyData public bool IsActive get set public String Data1 get set public String Data2 get set and an
  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 视图中的 XamlParseException

    我有一个仅显示标签的视图 视图模型已正确注入视图中 因为标签的文本已绑定到视图模型属性 现在 如果我尝试在 xaml 中定义 DataGrid 则会出现 XamlParseException System Windows Markup Xa
  • 将 PDF 嵌入到 WPF 应用程序中

    我正在尝试在 WPF 应用程序中嵌入 显示 PDF 到目前为止 我已经尝试过这些解决方案 但没有成功 在 a 中显示 PDFWindowsFormsHost主持一个AxAcroPdf控制 类似于显示的内容here http hugeonio
  • Winforms 中的 WPF ElementHost 最大化时崩溃 (Windows)

    我正在尝试将新的 WPF 控件集成到现有的 WinForms 应用程序中 并使用 ElementHost Dock Fill 来托管以下 XAML UserControl NET 4 当我将 WinForm 设置为最大化时 我的整个操作系统
  • 如何从代码隐藏访问ListBox动态创建的项目的属性?

    XAML
  • 如何使 WPF 应用程序在 Web 浏览器上运行

    我们有一个用 WPF 编写的现有应用程序 我们正在寻找一种迁移它的方法 以便它可以在 Web 浏览器上运行 深入研究后 我们似乎需要找到一种将代码编译为 WebAssembly 的方法 但我不确定它对于现有的完全加载的 WPF 应用程序有多
  • 先学Silverlight还是先学WPF?

    看来 Silverlight WPF 是 NET 用户界面开发的长期未来 这很棒 因为我可以看到在客户端和 Web 开发端重用 XAML 技能的优势 但看看 WPF XAML Silverlight 它们似乎是非常庞大的技术 那么从哪里开始
  • WPF:Prism 对于小型应用程序来说是不是太过分了?

    如果我不将我的应用程序分成不同的模块 否则我会认为 Prism 确实是可行的方法 我应该使用 Prism 吗 我知道 Prism 提供了一个方便的实现ICommand 我可以自己在一页代码中完成 并为我们提供IEventAggregator
  • WPF - 如何从 DataGridRow 获取单元格?

    我有一个具有交替行背景颜色的数据绑定 DataGrid 我想根据单元格包含的数据对单元格进行不同的着色 我已经尝试过该线程建议的解决方案 http wpf codeplex com Thread View aspx ThreadId 511
  • 需要“依赖属性”的简短而清晰的定义

    我试图弄清楚依赖属性到底是什么 但是当我在任何地方寻找定义时 我只找到 如何使用 而不是 它是什么 想象一下 您在面试时被问到 什么是依赖属性 你的答案是什么 DependencyProperty 是一个属性 其值取决于 或可以取决于 某些
  • WPF ListView/Gridview 允许用户选择多个项目并将它们分组在一起

    我在 MVVM 应用程序中有一个 WPF ListView GridViwe GridView 绑定到 ViewModel 中的列表 要求是用户应该能够选择网格视图的多行 右键单击它并看到上下文菜单 将这些行组合在一起 选择后 所有这些项目
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 将 Pivot 控件与 Observable Collection MVVM 绑定(Windows Phone 8)

    我是 WP8 和 MVVM 的新手 我创建了 wp8 应用程序 一旦用户登录 它就会请求各种数据 我只是无法动态创建我的数据透视表头 我不知道这是否是因为我在绑定中做了一些事情 INotifyPropertyChanged 两者或其他 这是
  • 如何在 WPF 应用程序上执行异步启动?

    我在异步等待方面相当落后 所以这可能是一个 duh 问题 我正在开发一个非常小的 UI 应用程序 它使用以下命令从系统托盘运行WPF 通知图标 http www codeproject com Articles 36468 WPF Noti
  • 是什么导致 WPF 打印机输出被光栅化?

    我在 WPF 中遇到了许多打印问题 其中正在打印的特定项目组合会突然触发打印机输出的光栅化 导致打印机输出丑陋且庞大 并可能导致打印每页需要 30 秒 我发现在控件上设置任何级别的不透明度之类的事情通常会触发此问题 我忘记了它还有什么作用

随机推荐

  • Magento,如何以编程方式禁用模块?

    我的目标是以编程方式禁用该模块 例如在某些观察者事件期间 我发现的最早的观察者是控制器前端初始化之前 所以我的模块正在监听它 然后执行下一步 Mage getConfig gt getModuleConfig IG LightBox gt
  • 如何通过跨域ajax获取响应头?

    我正在尝试阅读文档 但我必须承认这不是一件容易阅读的事情 我没有问题 添加 Access Control Allow Origin 标头后 读取responseText 但无法在除 Firefox 之外的任何地方获取响应标头 所以 我的问题
  • 在 R 中读取 CSV 文件并格式化日期和时间,同时读取并避免标记为的缺失值?

    我正在尝试在 R 中读取 CSV 文件 如何在读取时读取日期和时间并对其进行格式化 并避免丢失标记为 的值 我读取后加载的数据应该是干净的 我尝试过类似的东西data lt read csv Data txt 它有效 但日期和时间保持原样
  • 使用 mitmproxy 将 URL 更改为另一个 URL

    我正在尝试使用 mitmproxy 和 Python 将一个页面重定向到另一个页面 我可以毫无问题地与 mitmproxy 一起运行内联脚本 但在将 URL 更改为另一个 URL 时我遇到了困难 就像如果我访问 google com 它会重
  • 有没有办法将 Expo 应用程序与 firebase 动态链接集成而不分离?

    有没有办法将 Expo 应用程序与 firebase 动态链接集成而不分离 如果你需要create您可以使用新的即时动态链接REST API去做吧 在更可能的情况下 您只需要您的应用程序openFirebase 动态链接 除了配置 Expo
  • 如何使用 javascript 打开 url 并为请求设置自定义 HTTP 标头?

    我想在用户单击链接后通过 javascript 将用户重定向到某个网址 现在有什么方法可以随此请求一起发送自定义 http 标头 我想通过请求标头发送特定的 cookie 值 有问题的网址不属于我的域 有可能做到吗 如果是 怎么办 No 如
  • 检查给定的键是否已存在于字典中并递增它

    如何查明字典中的键是否已设置为非 None 值 如果已有该值 我想增加该值 否则将其设置为 1 my dict if my dict key is not None my dict key 1 else my dict key 1 您正在寻
  • 如何更改App Store中iPhone应用程序的设备兼容性?

    Our company has two app One s device target is iOS 9 let say first app and the other one s is iOS 8 1 let say second app
  • 在 C# 中将字符串转换为浮点型

    我正在转换像 41 00027357629127 这样的字符串 并且我正在使用 Convert ToSingle 41 00027357629127 or float Parse 41 00027357629127 这些方法返回4 1000
  • 将子类别的 Microsoft 图表控件 X 轴标签格式化为类似于 Excel 中生成的图表

    我在尝试复制使用 Microsoft Chart Control for Net 在 Microsoft Excel 2007 中生成的图表时遇到问题 该图表显示了一年中每个月的前 5 个条目 每个月可能有不同的 5 个条目 然后显示了一些
  • 如何在Android导航组件中管理BottomNavigationView backstack

    我在用navigation component and BottomNavigationView 我面临一个问题 那就是当我从fragment1 gt 2 gt 5 gt 4 gt 3 当我按下后退按钮时我得到fragment1 我知道这是
  • 为远程网页保存cookie

    我有一个 PHP 应用程序 需要从另一个网页获取内容 而我正在阅读的网页需要 cookie 我找到了有关如何在拥有 cookie 后进行此调用的信息 http groups google com group comp lang php ms
  • Android:AdMob 无法正常工作

    AdMob 不会显示在我的应用中 每次我调用loadAd 我收到以下错误 请求资源 0x7f0b000e 失败 因为它很复杂 谷歌 找不到播放服务资源 检查您的项目配置以确保包含资源 获取广告响应时出现问题 错误代码 1 我花了几个小时寻找
  • 两个同名的类型参数

    我想知道为什么按照下面的示例允许两个具有相同名称 A 的类型参数 名为 A 我知道这是类型参数的糟糕命名 不要这样做 我的猜测是它们位于不同的范围级别 例如类级别和函数级别 并且编译器正在使用某种名称修改 class MyTest A ty
  • Facebook 会缓存共享缩略图多长时间?

    Facebook 会缓存共享缩略图多长时间 我使用以下方法为我的页面添加了自定义缩略图 但在页面上显示了我以前的图像 gt 它缓存在 FB 服务器上的某个位置 有什么想法如何刷新缓存或者 FB 加载新图像需要多长时间 使用 Facebook
  • Future 与 void [重复]

    这个问题在这里已经有答案了 假设我想创建一个异步方法 我可以将其返回类型设置为 Future void 或简单地 void 如下面的示例所示 两种方法似乎都能奏效 那么两者有什么区别呢 什么时候应该使用 Future void 而不是 vo
  • 使用 Google Play Developer API 进行服务器端授权?

    需要授权才能从Google Play 开发者 API 我知道如何使用 Postman 来做到这一点 但是实现授权要麻烦得多 重定向 url 处理重定向等等 当您已经在内部设置了身份验证数据时 将执行这些步骤谷歌开发者API控制台 1 GET
  • 是否有理由在 VHDL 和 Verilog 中初始化(而不是重置)信号?

    我从未初始化过信号 这样 任何缺少重置或分配的信号都将是未知的或已初始化 在一些参考代码中它们有初始化 这违背了我的愿望 此外 由于初始化不可综合 因此可能会出现模拟 综合不匹配的情况 在这种情况下有什么理由初始化信号吗 编辑 2011 年
  • Opencv中SVM参数优化

    我想优化Opencv中的SVM参数 但是 每次我使用train auto I get C 1 and gamma 1 有些人使用 LibSVM 但我无法为此编写包装器 两个都trainingData and labels取自现有代码 该代码
  • 混合行为 - 你可以绑定到它们的属性吗?

    我目前正在将我创建的许多附加行为迁移到混合行为 以便它们支持在 Expression Blend 中进行拖放 我注意到混合行为的作者倾向于将行为属性定义为依赖属性 我创造了一种行为 TiltBehaviour 它公开了公共依赖属性 Tilt