【问题标题】:WPF trigger on datagrid to hide/show columns according to bindings数据网格上的 WPF 触发器以根据绑定隐藏/显示列
【发布时间】:2011-05-28 19:31:18
【问题描述】:

我有一个这样的数据网格:

<DataGrid AutoGenerateColumns="False" CanUserDeleteRows="True"
          HorizontalScrollBarVisibility="Hidden" Margin="10,10,10,10" 
          VerticalScrollBarVisibility="Visible" 
          CanUserAddRows="False" ItemsSource="{Binding ListGestores}"
          ToolTip="Selecione uma linha e pressione DELETE para remover uma unidade.">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding TB_UNIDADE.DS_NOME_UNIDADE}" CanUserResize="False" Header="Setor" IsReadOnly="True" x:Name=""/>
        <DataGridTextColumn Binding="{Binding TB_UNIDADE.TB_UNIDADE2.DS_NOME_UNIDADE}" CanUserResize="False" Header="Unidade" IsReadOnly="True" x:Name=""/>
        <DataGridTextColumn Binding="{Binding TB_CONTATOS.DS_NOME}" CanUserResize="False" Header="Gestor" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

问题是我需要验证2列绑定是否为null,如果为null,我需要隐藏它,并更改第1列的标题。

我知道我可以使用触发器来做到这一点,但究竟如何? 我开始了:

<DataGrid.Triggers>
    <DataTrigger Binding="{Binding TB_UNIDADE.TB_UNIDADE2}" Value="{x:Null}">
        <Setter Property="" Value="" />
    </DataTrigger>
</DataGrid.Triggers>

但我不知道该放什么二传手或其他什么!

帮帮我=]

【问题讨论】:

  • 好的 - 所以如果其中没有数据,您想隐藏一列 - 在所有行中还是什么? @decyclone:您提出的解决方案假设小对象位于数据网格本身的数据上下文中 - 我认为如果使用相对绑定向上遍历,这将起作用,但我不确定这是否是问题所在。如果是当该列的所有行都为空时,我将使用(相对源)绑定到 datagrid.Itemssource 的可见性,其中 valueconverter 贯穿所有项目 - 不是那么轻量级 - 或者我会在更新时在代码中执行此操作。

标签: wpf binding wpfdatagrid


【解决方案1】:

示例:

使用以下 ViewModel:

public class ViewModel : INotifyPropertyChanged
{
    public String Data1 { get; set; }
    public String Data2 { get; set; }
    public String Data3 { get; set; }
}

您可以使用以下示例 XAML:

<Grid.Resources>
    <local:DataGridColumnVisibilityConverter x:Key="DataGridColumnVisibilityConverter" />
</Grid.Resources>
<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Data1}"
                            Visibility="{Binding, Converter={StaticResource DataGridColumnVisibilityConverter}, ConverterParameter=Data1}" />
        <DataGridTextColumn Binding="{Binding Data2}"
                            Visibility="{Binding, Converter={StaticResource DataGridColumnVisibilityConverter}, ConverterParameter=Data2}" />
        <DataGridTextColumn Binding="{Binding Data3}"
                            Visibility="{Binding, Converter={StaticResource DataGridColumnVisibilityConverter}, ConverterParameter=Data3}" />
    </DataGrid.Columns>
</DataGrid>

和转换器:

public class DataGridColumnVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ViewModel viewModel = (ViewModel)value;

        switch (parameter.ToString().ToLower())
        {
            case "data1":
                return (!String.IsNullOrEmpty(viewModel.Data1)) ? Visibility.Visible : Visibility.Collapsed;
            case "data2":
                return (!String.IsNullOrEmpty(viewModel.Data2)) ? Visibility.Visible : Visibility.Collapsed;
            case "data3":
                return (!String.IsNullOrEmpty(viewModel.Data3)) ? Visibility.Visible : Visibility.Collapsed;
        }

        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 我很确定您不能对 DataGridTextColumn 开箱即用地使用可见性绑定,因为它不在可视化树中并且没有 DataContext。
  • 实际上,你可以,它就像一个魅力。 +1 为去旋风。或者,您可以制作自己的 DataGridTemplateColumns 并使用 DataTriggers,但我认为这里使用 decyclone 的解决方案更容易。
  • @David:如果不使用继承的数据上下文,我从来没有让它工作(在这里讨论:stackoverflow.com/questions/502389/…)。我试过这个例子,我得到的只是“System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。BindingExpression:(无路径);DataItem=null;目标元素是 'DataGridTextColumn'(HashCode=39268741 ); 目标属性是“可见性”(类型“可见性”)”
  • @David:是的,它通过设置这样的值来工作。不起作用的是绑定。含义:这有效:。但是,这不是:
  • 在写完我的评论后不久就明白了,所以我删除了它,但为时已晚;)
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 2023-01-17
  • 2013-10-19
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2013-04-19
相关资源
最近更新 更多