【发布时间】:2011-04-28 05:21:24
【问题描述】:
有没有办法根据绑定隐藏给定的列。我尝试在 DataGridTextColumn 上设置可见性属性(使用正确的转换器),但这似乎不起作用。如果我直接设置值(而不是通过绑定)它可以工作。那么,对于数据网格来说,列可见性是全有还是全无?
【问题讨论】:
有没有办法根据绑定隐藏给定的列。我尝试在 DataGridTextColumn 上设置可见性属性(使用正确的转换器),但这似乎不起作用。如果我直接设置值(而不是通过绑定)它可以工作。那么,对于数据网格来说,列可见性是全有还是全无?
【问题讨论】:
看看这个帖子,问题说明了
Binding in a WPF data grid text column
在这里
http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
从第一个链接引用 JaredPar
“本质上的问题是 DataGridTextColumn 没有可以从其继承绑定的父级,因为它不是逻辑或可视树的一部分。您必须设置继承上下文才能访问绑定信息”
解决方法以使其正常工作..
public class DataGridContextHelper
{
static DataGridContextHelper()
{
DependencyProperty dp = FrameworkElement.DataContextProperty.AddOwner(typeof(DataGridColumn));
FrameworkElement.DataContextProperty.OverrideMetadata(typeof(DataGrid),
new FrameworkPropertyMetadata
(null, FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnDataContextChanged)));
}
public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DataGrid grid = d as DataGrid;
if (grid != null)
{
foreach (DataGridColumn col in grid.Columns)
{
col.SetValue(FrameworkElement.DataContextProperty, e.NewValue);
}
}
}
}
public partial class App : Application
{
static DataGridContextHelper dc = new DataGridContextHelper();
}
<DataGrid x:Name="c_dataGrid" AutoGenerateColumns="False" DataContext="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=SelectedItem}">
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Path=(FrameworkElement.DataContext), RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource HideColumnAConverter}}" />
</DataGrid.Columns>
</DataGrid>
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return Visibility.Visible;
}
// Whatever you're binding against
TestClass testClass = value as TestClass;
return testClass.ColumnAVisibility;
}
【讨论】:
你真正需要做的就是添加:
<Style x:Key="vStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Visibility" Value="{Binding YourObjectVisibilityProperty}"/>
</Style>
然后在您的列中使用以下内容:
<DataGridTextColumn CellStyle="{StaticResource vStyle}"/>
【讨论】: