首先DataGridTextColumn
或其他任何受支持的dataGrid列都不位於的可視樹中DataGrid
。因此,在默認情況下它不會繼承DataContext
的DataGrid
。但是,它Binding
僅適用於DP,而不適用於DataGridColumn上的其他DP。
因爲它們並不位於同一VisualTree中,所以使用DataContext進行的任何嘗試RelativeSource
都將無法正常工作,因爲DataGrid無法遍歷DataGrid。
但是有兩種方法可以實現:
首先使用Freezable
類-Freezable
即使對象不在視覺或邏輯樹中,它們也可以繼承DataContext。因此,我們可以利用它來進行使用。
首先創建從Freezable
和Data
DP繼承的類,我們可以使用它們在XAML中進行綁定:
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的DataContext,然後可以與其數據DP綁定:
<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>
其次,您可以使用ElementName
或引用XAML中的任何UI元素x:Reference
。但是ElementName
只能在同一視覺樹中使用,而x:Reference沒有這種約束。
因此,我們也可以利用該優勢。FrameworkElement
在“可見性”設置爲“摺疊”的XAML中創建虛擬對象。FrameworkElement將從其父容器(可以是Window或UserControl)繼承DataContext。
並可以在DataGrid中使用它:
<FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Test"
Binding="{Binding Name}"
Visibility="{Binding DataContext.IsEnable,
Source={x:Reference dummyElement}}"/>
</DataGrid.Columns>
</DataGrid>