http://www.thomaslevesque.com/2011/03/21/wpf-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【项目】的更多相关文章

  1. [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 ...

  2. jquery方法详解--bind(type, [data], fn)

    转自:http://www.zhufengpeixun.cn/jquery/bind_type_data_fn.html bind(type, [data], fn)  返回值::jQuery 概述 ...

  3. Spring mvc Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  4. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  5. Spring Data Redis—Pub/Sub(附Web项目源码) (转)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  6. datagrid其中某列需要动态隐藏或显示的mvvm绑定方式,也可以用在其他表格类型控件上

    版权归原作者所有. 引用地址 [WPF] HOW TO BIND TO DATA WHEN THE DATACONTEXT IS NOT INHERITED MARCH 21, 2011 THOMAS ...

  7. Data Binding in WPF

    http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1   Data Binding in WPF John Papa Code downl ...

  8. WPF之DataContext(转)

    WPF之DataContext(转) 有时候不是你不够聪明,而是别人教给你的东西太烂!相信自己! 这是我认为,目前网络上对“DataContext”解释最好的一篇文章,跟大家分享. 原文地址:http ...

  9. 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 ...

随机推荐

  1. LINUX下的tty,console与串口分析

    1.LINUX下TTY.CONSOLE.串口之间是怎样的层次关系?具体的函数接口是怎样的?串口是如何被调用的? 2.printk函数是把信息发送到控制台上吧?如何让PRINTK把信息通过串口送出?或者 ...

  2. Java 设计模式学习总结(下)

    (八)模板方法 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. templateMethod()会依次调用 ...

  3. php动态生成一个xml文件供swf调用

    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdo ...

  4. jquery、js操作checkbox全选反选

    全选反选checkbox在实际应用中比较常见,本文有个不错的示例,大家可以参考下 操作checkbox,全选反选//全选 function checkAll() { $('input[name=&qu ...

  5. 对于cocos2d-x lua的防护措施

    自从cocos2d-x 用了 luajit之后,对于我们用lua开发的开发者来说,可是一个好消息,不单性能提升了不少,更重要的是在lua加密方面省了不少心,为什么,就是因为,luajit编译的字节码, ...

  6. CAD操作

    1.建立构造线 说签名和图签不在同一条直线上,如何判断两个对向到底是不是在一条线上呢?通过构造线( Construction Line)可以进行判断,CAD中打入: xl 命令,再键入h(horizo ...

  7. 使用Python拼接多张图片

    写机器学习相关博文,经常会碰到很多公式,而Latex正式编辑公式的利器.目前国内常用的博客系统,好像只有博客园支持,所以当初选择落户博客园.我现在基本都是用Latex写博文,然后要发表到博客园上与大家 ...

  8. 闲置小U盘变身最强大路由器

    小容量 U 盘,用起来嫌容量太少,丢了好像又觉得太可惜.不过现在将它进行一番小改造后,配合我们的电脑 ,就能得到一台强大的路由器,不仅省了买路由的钱,而且这台路由器在市面上基本买不到 !     DD ...

  9. 用python产生一个好的秘钥

    import os os.urandom(24)

  10. AS3垃圾回收整理

    AS3垃圾回收整理 转自 http://bbs.wefdc.com/thread-2366-1-1.html 来源页面: http://www.adobe.com/devnet/actionscrip ...