問題:因爲
DataGridColumn
s不是可視樹的一部分,他們不能使用datagrid的datacontext。
解決方法
1
:代理類
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}"></local:BindingProxy>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Grade"
Visibility="{Binding Data.MyColumnVisibility, Source={StaticResource proxy}}"
Binding="{Binding Path=Grade}">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
解決方法
2
:代元素
1.在用戶控件的Resources里加一個代理FrameworkElement,並綁定控件的datacontex
2.把這個代理控件放在一個不可見的ContentControl裏
<FrameworkElement x:Name="dummyElement" Visibility="Collapsed" DataContext="{Binding}"/>
3.將DataGridColumn的Visibility綁定Datacontext中的屬性,比如IsEnable、或NoVisibility,Source採用x:Reference dummyElement。
4.如果綁定屬性是bool類型,還要使用Converter轉換一下
<DataGrid …>
<DataGrid.Columns>
<DataGridTextColumn Header="No."
Visibility="{Binding DataContext.IsEnable, Source={x:Reference dummyElement},Converter={StaticResource BooleanToVisibilityConverter}}"
Binding="{Binding Path=No}">
</DataGridTextColumn>
<DataGridTextColumn Header="Name"
Visibility="{Binding DataContext.NoVisibility, Source={x:Reference dummyElement}}"
Binding="{Binding Path=Name}">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
代碼:http://download.csdn.net/download/xiudou_123/9836031