当前位置: 首页 > news >正文

wpf DynamicResource的ResourceKey值进行绑定

wpf 中的DynamicResource 的ResourceKey不支持绑定的,因为它不是个DependencyProperty,但又想动态指定ResourceKey
场景:
Name属性有多个值 zhangsan,lisi,wangwu
对应不同资源文件中的

//  style1<sys:String x:Key="zhangsan">张三</sys:String><sys:String x:Key="lisi">李四</sys:String><sys:String x:Key="wangwu">王五</sys:String>
// 另一个文件中的 style2        <sys:String x:Key="zhangsan">ZhangSan</sys:String><sys:String x:Key="lisi">LiSi</sys:String><sys:String x:Key="wangwu">WangWu</sys:String>

实现动态改变Name的同时进行动态资源绑定

<ItemsControl ItemsSource="{Binding StudentList}"><ItemsControl.ItemTemplate><HierarchicalDataTemplate><TextBlock><TextBlock.Text><MultiBinding Converter="{StaticResource dynBindingConv}" ConverterParameter="TextProperty"><Binding Path="Name"/><Binding RelativeSource="{RelativeSource Self}"/></MultiBinding></TextBlock.Text></TextBlock></HierarchicalDataTemplate></ItemsControl.ItemTemplate></ItemsControl>

可以通过Converter实现,stackoverflow上有个实现方法点击跳转
但工作量太大下面是简陋但能实现效果的方法
xaml:

<converter:DynamicBindingConverter x:Key="dynBindingConv"/>

<TextBlock><TextBlock.Text><MultiBinding Converter="{StaticResource dynBindingConv}" ConverterParameter="TextProperty"><Binding Path="Name"/><Binding RelativeSource="{RelativeSource Self}"/></MultiBinding></TextBlock.Text>
</TextBlock>
public class DynamicBindingConverter: IMultiValueConverter{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){var key = values[0];var control = values[1] as FrameworkElement;var property = parameter.ToString();Type type = control.GetType();FieldInfo field = type.GetField(property, BindingFlags.Public | BindingFlags.Static);DependencyProperty d_property = (DependencyProperty)field.GetValue(null);var dynamicResource = new DynamicResourceExtension(key);var resourceReferenceExpression = dynamicResource.ProvideValue(null);control.SetValue(d_property, resourceReferenceExpression);return Application.Current.Resources[key.ToString()];}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}}

难点主要是通过反射得到DependencyProperty

发现有的控件找不到对应属性,是因为反射只在当前类中查找不会去父类(或者基类)中查找``对上述代码用下修改即可

public class DynamicBindingConverter: IMultiValueConverter{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){var key = values[0];var control = values[1] as FrameworkElement;var property = parameter.ToString();Type type = control.GetType();FieldInfo field = null;while (type != null){field = type.GetField(property, BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public);if (field != null){break;}type = type.BaseType;}if (field != null){DependencyProperty d_property = (DependencyProperty)field.GetValue(null);var dynamicResource = new DynamicResourceExtension(key);var resourceReferenceExpression = dynamicResource.ProvideValue(null);control.SetValue(d_property, resourceReferenceExpression);return Application.Current.Resources[key.ToString()];}else{return Application.Current.Resources["none"];}}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue2版本空目录下创建新项目的方法2024
  • RocketMQ~刷盘机制、主从复制方式、存储机制
  • Nginx - 反向代理、缓存详解
  • msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案
  • Linux网络配置和系统管理
  • 【发邮件】 在邮件中添加 (mailto:) 链接的返回电子邮件
  • 【Python】机器学习中的 K-均值聚类算法及其优缺点
  • 解决在IIS下typecho访问网址为localhost的问题
  • MySQL 系统学习系列 - SQL 语句 DQL 语句的使用(3)《MySQL系列篇-05》
  • Lua 迭代器
  • 5、指针
  • Wireshark_UDP_v7.0
  • OpenCV几何图像变换(6)计算反转仿射变换函数invertAffineTransform()的使用
  • Springboot里集成Mybatis-plus、ClickHouse
  • PsConvertToGuiThread函数调用前传
  • [数据结构]链表的实现在PHP中
  • 2017前端实习生面试总结
  • 77. Combinations
  • interface和setter,getter
  • iOS编译提示和导航提示
  • JavaScript DOM 10 - 滚动
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • RxJS: 简单入门
  • vue2.0项目引入element-ui
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 高度不固定时垂直居中
  • 精彩代码 vue.js
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 你不可错过的前端面试题(一)
  • 前端
  • 使用SAX解析XML
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 我有几个粽子,和一个故事
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • !!Dom4j 学习笔记
  • # Redis 入门到精通(七)-- redis 删除策略
  • # 数仓建模:如何构建主题宽表模型?
  • # 数论-逆元
  • #Z0458. 树的中心2
  • #数据结构 笔记一
  • $.each()与$(selector).each()
  • (1)Android开发优化---------UI优化
  • (1)STL算法之遍历容器
  • (11)MSP430F5529 定时器B
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (十八)SpringBoot之发送QQ邮件
  • (四)js前端开发中设计模式之工厂方法模式
  • (算法设计与分析)第一章算法概述-习题
  • (一) storm的集群安装与配置
  • .NET Core跨平台微服务学习资源
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例