背景

需要对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列绑定不上的问题的更多相关文章

  1. [WinForm] DataGridView 绑定 DT && ComboBox 列绑定 Dict

    一  需求介绍 一般像枚举类型的数据,我们在数据库里存储着诸如(1.2.3.4-)或者("001"."002"."003"-)此类,但是界面 ...

  2. WPF Binding ElementName方式无效的解决方法--x:Reference绑定

    原文:WPF Binding ElementName方式无效的解决方法--x:Reference绑定 需求: 背景:Grid的有一个TextBlock name:T1和一个ListBox,ListBo ...

  3. DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  4. WPF PasswordBox不支持绑定解决方法

    原文:WPF PasswordBox不支持绑定解决方法 PasswordBox的Password属性因为安全原因不支持直接绑定,可以使用依赖属性实现.直接插入代码 public class Passw ...

  5. WPF使用后台C#代码创建Grid

    笔者刚刚接触WPF,菜鸟一枚,在做一个练手程序时遇到这样一个需求,创建一个新的Grid并将其添加至一个ListView中,要求Grid及其子元素应按一定顺序给Name属性赋值,直接使用XAML创建的话 ...

  6. 【WPF学习】第二十九章 元素绑定——将元素绑定到一起

    数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这 ...

  7. WPF教程三:学习Data Binding把思想由事件驱动转变为数据驱动

    之前大家写代码都喜欢用事件驱动,比如说鼠标输入的click事件.初始化的内容全部放在窗体加载完毕的load事件,等等,里面包含了大量的由事件触发后的业务处理代码.导致了UI和业务逻辑高度耦合在一个地方 ...

  8. 14、手把手教你Extjs5(十四)模块字段和Grid列的定义[2]

    model和columns生成好了,下面要修改一下Module.js和Grid.js中的代码,使其能够协同工作. /** * 一个模块的主控界面的容器,用来安放各个模块控件以及协调他们之间的关系 */ ...

  9. 给angularJs grid列上添加自定义按钮

    由于项目需要在angular 显示的表格中添加按钮,多次查询资料终于找到解决方法.就是给columnDefs 上的列增加 cellTemplate,同时绑定对应的触发事件,代码如下 columnDef ...

随机推荐

  1. Docker 网络模型之 macvlan 详解,图解,实验完整

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 上一篇文章我们 ...

  2. Unity IK(反向运动学)初探

    http://blog.csdn.net/myarrow/article/details/44450199 1. 简介 IK与FK对应,正向运动学就是根骨骼带动节点骨骼运动.而反向运动学就是反过来,由 ...

  3. nginx 的启动、停止与重启

    详解 ./nginx #打开 nginx nginx -s reload|reopen|stop|quit #重新加载配置|重启|停止|退出 nginx nginx -t #测试配置是否有语法错误 n ...

  4. python使用C扩展

    CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/C API.每 ...

  5. Git本地分支与远程分支关联

    当clone完版本库,切换到开发分支后,使用git pull -r 拉取并合并分支之后会出现一下提示: $ git pull -rFrom ssh://192.168.1.226:29418/etha ...

  6. UVa12716:gcd等于xor(打表+类素数筛+差分约束)

    紫书给的分析缺少一些证明性的东西,将我自己的OneNote笔记贴在这里.

  7. (动态规划)UVA-11400:Lighting System Design

    You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...

  8. bzoj2818: Gcd懵逼乌斯反演

    由于是单组数据,强行不分块O(n)过 线性筛部分非常神奇,用了一个奇妙的推导(懒得写了) #include <bits/stdc++.h> using namespace std; ],f ...

  9. Metasploits之Adobe阅读器漏洞

    实验环境:Kali 2.0+Windows XP+Adobe Reader 9.3.0 类别:缓冲区溢出 描述:这个漏洞针对Adobe阅读器9.3.4之前的版本,一个名为SING表对象中一个名为uni ...

  10. Linux--NiaoGe-Service-06

    Linux网络排错 思路: 硬件问题: 首先排除硬件故障,包括网线.Hub.Switch.Router.网卡.设备配置规则等等. 软件问题: 1.网卡的IP/Netmask设置错误 IP.Netmas ...