How to bind to data when the DataContext is not inherited【项目】
The DataContext property in WPF is extremely handy, because it is automatically inherited by all children of the element where you assign it; therefore you don’t need to set it again on each element you want to bind. However, in some cases the DataContext is not accessible: it happens for elements that are not part of the visual or logical tree. It can be very difficult then to bind a property on those elements…
Let’s illustrate with a simple example: we want to display a list of products in a DataGrid. In the grid, we want to be able to show or hide the Price column, based on the value of a ShowPrice property exposed by the ViewModel. The obvious approach is to bind the Visibility of the column to the ShowPrice property:
|
1
2
3
|
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False" Visibility="{Binding ShowPrice, Converter={StaticResource visibilityConverter}}"/> |
Unfortunately, changing the value of ShowPrice has no effect, and the column is always visible… why? If we look at the Output window in Visual Studio, we notice the following line:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=ShowPrice; DataItem=null; target element is ‘DataGridTextColumn’ (HashCode=32685253); target property is ‘Visibility’ (type ‘Visibility’)
The message is rather cryptic, but the meaning is actually quite simple: WPF doesn’t know which FrameworkElement to use to get the DataContext, because the column doesn’t belong to the visual or logical tree of the DataGrid.
We can try to tweak the binding to get the desired result, for instance by setting the RelativeSource to the DataGrid itself:
|
1
2
3
4
|
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False" Visibility="{Binding DataContext.ShowPrice, Converter={StaticResource visibilityConverter}, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}"/> |
Or we can add a CheckBox bound to ShowPrice, and try to bind the column visibility to the IsChecked property by specifying the element name:
|
1
2
3
4
|
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False" Visibility="{Binding IsChecked, Converter={StaticResource visibilityConverter}, ElementName=chkShowPrice}"/> |
But none of these workarounds seems to work, we always get the same result…
At this point, it seems that the only viable approach would be to change the column visibility in code-behind, which we usually prefer to avoid when using the MVVM pattern… But I’m not going to give up so soon, at least not while there are other options to consider ![]()
The solution to our problem is actually quite simple, and takes advantage of the Freezable class. The primary purpose of this class is to define objects that have a modifiable and a read-only state, but the interesting feature in our case is that Freezable objects can inherit the DataContext even when they’re not in the visual or logical tree. I don’t know the exact mechanism that enables this behavior, but we’re going to take advantage of it to make our binding work…
The idea is to create a class (I called it BindingProxy for reasons that should become obvious very soon) that inherits Freezable and declares a Data dependency property:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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); } } // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));} |
We can then declare an instance of this class in the resources of the DataGrid, and bind the Data property to the current DataContext:
|
1
2
3
|
<DataGrid.Resources> <local:BindingProxy x:Key="proxy" Data="{Binding}" /></DataGrid.Resources> |
The last step is to specify this BindingProxy object (easily accessible with StaticResource) as the Source for the binding:
|
1
2
3
4
|
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="False" Visibility="{Binding Data.ShowPrice, Converter={StaticResource visibilityConverter}, Source={StaticResource proxy}}"/> |
Note that the binding path has been prefixed with “Data”, since the path is now relative to the BindingProxy object.
The binding now works correctly, and the column is properly shown or hidden based on the ShowPrice property.
项目中我是这样做的:
做一个BindingProxy类
aaarticlea/png;base64,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" alt="" width="276" height="185" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows; namespace Halliburton.Castor.Controls
{
class BindingProxy : Freezable
{
#region Overrides of Freezable protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
} #endregion public object DataContextData
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
} // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("DataContextData", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
}
<ControlTemplate x:Key="DataGridForOilSwell_Template">
<DataGrid x:Name="datagrid"
Margin="10,0"
VerticalAlignment="Top"
AutoGenerateColumns="False"
Background="#FFD1D2D4"
CanUserAddRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CellStyle="{StaticResource DataGrid_Cell_Style}"
HorizontalScrollBarVisibility="Disabled"
IsReadOnly="True"
ItemsSource="{Binding ResultItems}"
RowHeaderWidth="0"
RowStyle="{StaticResource DataGrid_Row_Style}"
ScrollViewer.CanContentScroll="False"
Style="{StaticResource DataGridStyle}">
<DataGrid.Resources>
<controls:BindingProxy x:Key="proxy" DataContextData="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Width="*"
MinWidth="115"
CellTemplate="{StaticResource RubberTypeRow_DataTemplate}"
HeaderStyle="{StaticResource DataGrid_ColumnHeader_Style}"
HeaderTemplate="{StaticResource DesignNameHeader_DataTemplate}" /> <DataGridTemplateColumn Width="*"
MinWidth="90"
CellTemplate="{StaticResource VolumeHoleIDRow_DataTemplate}"
HeaderStyle="{StaticResource DataGrid_ColumnHeader_Style}"
HeaderTemplate="{StaticResource VolumeHoleIDHeader_DataTemplate}" /> <DataGridTemplateColumn x:Name="AvgPackerTempColumn"
Width="*"
MinWidth="60"
CellTemplate="{StaticResource AvgPackerTempRow_DataTemplate}"
HeaderStyle="{StaticResource DataGrid_ColumnHeader_Style}"
HeaderTemplate="{StaticResource AvgPackerTempHeader_DataTemplate}"
Visibility="{Binding DataContextData.IsStimulation,
Source={StaticResource proxy},
Converter={StaticResource boolToVisibilityConverter}}" />
<DataGridTemplateColumn x:Name="DeltaTempColumn"
Width="*"
MinWidth="60"
CellTemplate="{StaticResource DeltaTempRow_DataTemplate}"
HeaderStyle="{StaticResource DataGrid_ColumnHeader_Style}"
HeaderTemplate="{StaticResource DeltaTempHeader_DataTemplate}"
Visibility="{Binding DataContextData.IsStimulation,
Source={StaticResource proxy},
Converter={StaticResource boolToVisibilityConverter}}" />
......
How to bind to data when the DataContext is not inherited【项目】的更多相关文章
- [WPF] How to bind to data when the datacontext is not inherited
原文:[WPF] How to bind to data when the datacontext is not inherited 原文地址:http://www.thomaslevesque.co ...
- jquery方法详解--bind(type, [data], fn)
转自:http://www.zhufengpeixun.cn/jquery/bind_type_data_fn.html bind(type, [data], fn) 返回值::jQuery 概述 ...
- Spring mvc Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- datagrid其中某列需要动态隐藏或显示的mvvm绑定方式,也可以用在其他表格类型控件上
版权归原作者所有. 引用地址 [WPF] HOW TO BIND TO DATA WHEN THE DATACONTEXT IS NOT INHERITED MARCH 21, 2011 THOMAS ...
- Data Binding in WPF
http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1 Data Binding in WPF John Papa Code downl ...
- WPF之DataContext(转)
WPF之DataContext(转) 有时候不是你不够聪明,而是别人教给你的东西太烂!相信自己! 这是我认为,目前网络上对“DataContext”解释最好的一篇文章,跟大家分享. 原文地址:http ...
- How to bind a Command on a ContextMenu within a DataTemplate using MVVM
Since the Popuup control has it's separate visual tree, you cannot use find ancestor to find the Gri ...
随机推荐
- 对于fmri的设计矩阵构造的一个很直观的解释-by 西南大学xulei教授
本程序意在解释这样几个问题:完整版代码在本文的最后. 1.实验的设计如何转换成设计矩阵? 2.设计矩阵的每列表示一个刺激条件,如何确定它们? 3.如何根据设计矩阵和每个体素的信号求得该体素对刺激的敏感 ...
- lseek()函数
lseek()有个特殊的用途,确定文件是常规文件还是设备.<pre lang="c" escaped="true">off_t currpos;ou ...
- 如何使用 Java 中的数组
Java 中操作数组只需要四个步骤: 1. 声明数组 语法: 数据类型[ ] 数组名: 或者 数据类型 数组名[ ]: 其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指 ...
- PHP include()和require()方法的区别
本文总结了PHP的include()和require()两种包含外部文件的方法的不同之处.基本上就是,加载失败的处理方法,性能,以及使用弹性方面的不同. PHP的include()和require() ...
- ios 页面传值4种方式(四) 之通过delegate(代理)
这是ios里最常用的设计模式了,简直贯穿了整个cocoa touch框架.废话不多说,直接上代码: 场景是: A--打开--B; B里输入数值,点击--返回--A; A里显示B输入的值; △在开始写之 ...
- C#调用其它语言(例如C++)DLL文件中函数的方法摘要
有托管和非托管的概念没仔细看,接下来记录的引用Dll文件指的是无法通过VS自动完成添加引用的情况,可以使用如下方法: 步骤一: 打开“Visual Studio Tools”的“命令提示符”工具 使用 ...
- Python状况:为什么PyPy是Python的未来?
Python 现在已经不仅仅是胶水脚本语言了. 不信?看看下面使用Python的成功案例: YouTube - 主要由 Python编写 NASA Industrial Light & Mag ...
- 记录一下ORACLE 10gR2的软件下载地址,备用。
转载自:http://www.eygle.com/archives/2008/06/10gr2_download_link.html 记录一下ORACLE 10gR2的软件下载地址,备用. 下载OTN ...
- 关于Windows API、CRT和STL二三事
1.本文编写目的 本文是为了帮助一些人弄清一些关于Windows API, C运行时程序库(CRT), 和标准C++库(STL)的基本概念.有很多人甚至是有经验的程序员在这些概念上是含糊不清的甚 ...
- 14个超赞的响应式HTML5模板免费下载
现在HTML5已经势不可挡.很多朋友开始学习HTML5,当你已经学习过一些HTML5的教程之后,是不是想立即开始实战了呢?对,现在就开始吧,不过 找一些优秀的HTML5模板案例练习是相当不错的注意.当 ...