WPF使用附加属性绑定,解决data grid列绑定不上的问题
背景
需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景。
1.xaml 代码
<DataGridTemplateColumn Header="Control" HeaderStyle="{StaticResource controlHeader}"
local:ControlView.ControlEnabled="{Binding Value.ControlMasterEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Source={StaticResource dataContextSource}}">
2. 类声明附加属性
public static bool GetControlEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(ControlEnabledProperty);
} public static void SetControlEnabled(DependencyObject obj, bool value)
{
obj.SetValue(ControlEnabledProperty, value);
} // Using a DependencyProperty as the backing store for ControlEnabled. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ControlEnabledProperty =
DependencyProperty.RegisterAttached("ControlEnabled", typeof(bool), typeof(ControlView));
然后在对应的headerstyle里绑定这个附加属性,就能针对不同的列设定不同的值了
注意:附加属性绑定要使用括号,不然会绑定不上。
<!--样式部分代码-->
<CheckBox Grid.Column="1"
IsChecked="{Binding Column.(local:ControlView.ControlEnabled),Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
另外由于DataGrid的列不在VisualTree里,所以如果在列里面使用附加属性,并绑定值到附加属性会绑定失败(使用相对绑定,查找ancestor方式),如果是使用x:Reference绑定则会出现cyclical dependency异常。
三种方式解决绑定问题
1.声明一个类,并放到resource里,对类里的属性绑定,datagrid列绑定使用资源数据
public class BindingProxy : Freezable
{
#region Overrides of Freezable protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
} #endregion public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
} public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy));
}
<DataGrid>
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Data.MyColumnVisibility,
Source={StaticResource proxy}}"/>
</DataGrid.Columns>
</DataGrid>
2. 不够elegant的方法,将datagrid那一列放到resource里。
<DataGridTemplateColumn x:Key="controlColumn" Header="Control" HeaderStyle="{StaticResource controlHeader}"
local:ControlView.ControlEnabled="{Binding Value.ControlMasterEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource Mode=FindAncestor,Type={x:Type local:ControlView}}}">
然后在datagrid里使用资源的方式加入列
<DataGrid.Columns>
<StaticResource ResourceKey="controlColumn"/>
3. 使用已有的的对象绑定值,再在列里面使用(和第一种方式类似,不过不用自己写一个类)(本人推荐)
<DiscreteObjectKeyFrame x:Key="dataContextSource" Value="{Binding}"/>
使用方式
<DataGridTemplateColumn x:Name="controlColumn" HeaderStyle="{StaticResource controlHeader}"
local:ControlView.ControlEnabled="{Binding Value.ControlMasterEnabled,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Source={StaticResource dataContextSource} }">
参考:
https://stackoverflow.com/questions/22073740/binding-visibility-for-datagridcolumn-in-wpf/22074985
WPF使用附加属性绑定,解决data grid列绑定不上的问题的更多相关文章
- [WinForm] DataGridView 绑定 DT && ComboBox 列绑定 Dict
一 需求介绍 一般像枚举类型的数据,我们在数据库里存储着诸如(1.2.3.4-)或者("001"."002"."003"-)此类,但是界面 ...
- WPF Binding ElementName方式无效的解决方法--x:Reference绑定
原文:WPF Binding ElementName方式无效的解决方法--x:Reference绑定 需求: 背景:Grid的有一个TextBlock name:T1和一个ListBox,ListBo ...
- DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...
- WPF PasswordBox不支持绑定解决方法
原文:WPF PasswordBox不支持绑定解决方法 PasswordBox的Password属性因为安全原因不支持直接绑定,可以使用依赖属性实现.直接插入代码 public class Passw ...
- WPF使用后台C#代码创建Grid
笔者刚刚接触WPF,菜鸟一枚,在做一个练手程序时遇到这样一个需求,创建一个新的Grid并将其添加至一个ListView中,要求Grid及其子元素应按一定顺序给Name属性赋值,直接使用XAML创建的话 ...
- 【WPF学习】第二十九章 元素绑定——将元素绑定到一起
数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这 ...
- WPF教程三:学习Data Binding把思想由事件驱动转变为数据驱动
之前大家写代码都喜欢用事件驱动,比如说鼠标输入的click事件.初始化的内容全部放在窗体加载完毕的load事件,等等,里面包含了大量的由事件触发后的业务处理代码.导致了UI和业务逻辑高度耦合在一个地方 ...
- 14、手把手教你Extjs5(十四)模块字段和Grid列的定义[2]
model和columns生成好了,下面要修改一下Module.js和Grid.js中的代码,使其能够协同工作. /** * 一个模块的主控界面的容器,用来安放各个模块控件以及协调他们之间的关系 */ ...
- 给angularJs grid列上添加自定义按钮
由于项目需要在angular 显示的表格中添加按钮,多次查询资料终于找到解决方法.就是给columnDefs 上的列增加 cellTemplate,同时绑定对应的触发事件,代码如下 columnDef ...
随机推荐
- MFC中CArray类原理及其应用
1.CArray类应用 函数简介CArray::GetSize int GetSize( ) const;取得当前数组元素个数. CArray::GetUpperBound int GetUpperB ...
- Mybatis:resultMap的使用总结(转自https://www.cnblogs.com/kenhome/p/7764398.html)
resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...
- OPENGL4_变换
几种变换的几何意义说明 http://blog.csdn.net/onafioo/article/details/22094247 变换的执行顺序问题 正常顺序 1 视图(观察)变换 2 模型变换 3 ...
- qscoj53(图的m着色问题)
题目链接:http://qscoj.cn/contest/12/problem/53/ 题意:中文题诶- 思路:n个点, 那么最多用n种颜色,所以我们可以枚举颜色种类1~n,然后再判断用 i 种颜色可 ...
- 阿里巴巴开源性能监控神器Arthas初体验
如果问性能测试中最难的是哪部分,相信很多人会说“性能调优”.确实是这样,性能调优是一个非常复杂.技术含量很高的工作.涉及到的知识面很广.以我多年从业经验来看,在企业里,大多数的性能调优都是由开发架构师 ...
- SpiderMonkey 入门学习(一)
spidermonkey 源码下载:http://ftp.mozilla.org/pub/mozilla.org/js/ 测试系统 Ubuntu 12.04, js 1.7.0, js 解压在/opt ...
- bzoj2825:[AHOI2012]收集资源
传送门 看到数据范围这么小,就没想过暴力的办法么 考虑肯定是从近走到远,所以走的点之间一定没有其他的点,所以我们就可以暴力的建图,然后暴力的去dfs就好了 代码: #include<cstdio ...
- Location replace() 方法
replace() 方法可用一个新文档取代当前文档. <!DOCTYPE html> <html> <head> <meta charset="ut ...
- JSP && Servlet | 上传文件
在WebContent下新建index.jsp 要点: 1. 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法. 2. 表单 enctype 属性应该设置为 multip ...
- 转:php中的匿名函数和闭包(closure)
一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...