WPF Hide DataGridTemplateColumn, когда все значения пусты - PullRequest
0 голосов
/ 30 октября 2018

У меня есть таблица данных WPF с некоторыми столбцами. У меня есть один столбец, который будет пустым в большинстве случаев. Колонка заполнена маленькой кнопкой. Кнопка имеет конвертер видимости в зависимости от свойства, чтобы показать / не показать. Поэтому я хочу, чтобы эта колонка не отображалась, если кнопки не отображаются. Можно ли это сделать в xaml?

Ниже мой код.

<DataGrid name="..." ItemsSource="...">
    <DataGrid.Columns>
        <DataGridTextColumn ...
        <DataGridTextColumn ...
        <DataGridTextColumn ...
        <DataGridTextColumn ...
        <DataGridTemplateColumn>
              <DataGridTemplateColumn.CellTemplate>
                   <DataTemplate>
                       <Button Visibility="{Binding IsShown Converter={StaticResource BooleanToCollapseConverter}}" Command="...">
                            <Image Source="...">
                            </Image>
                        </Button>
                   </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Я пытался установить ширину столбца данных в табличной колонке на авто, но это не сработало. Одна вещь, которая будет работать, это проверить код, если мой столбец должен быть пустым, и сохранить его в логическое значение, чтобы преобразовать его в visibility.collapse. Но это должен быть мой последний вариант.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

вы можете настроить видимость напрямую в столбце данных или текстовом столбце. Дело в том, что эти столбцы не лежат в визуальном дереве сетки данных, что означает, что он не наследует текст данных своего родителя. Если вы хотите убедиться, что привязка работает, вы должны создать какой-то прокси, который будет наследовать текст данных от родительского элемента управления, например:

<FrameworkElement x:Name="Proxy" Visibility="Collapsed" />

в любом месте элемента управления, который, как вы уверены, имеет правильный текстовый текст. Этот элемент унаследует его наверняка. Итак ... приступаем прямо к делу. Я сделал небольшой пример для вас, чтобы изменить видимость в привязках вашей колонки:

<Grid>
    <FrameworkElement x:Name="Proxy" Visibility="Collapsed" />
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Customers}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            <DataGridTextColumn Header="Name" Binding="{Binding Surname}" />
            <DataGridTextColumn Header="Name" Binding="{Binding Age}" />
            <DataGridTemplateColumn Visibility="{Binding DataContext.IsShown, Converter={StaticResource BoolToVisibilityConverter}, Source={x:Reference Proxy}}">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Test" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
        <DataGrid.ItemContainerStyle>
            <Style TargetType="{x:Type DataGridRow}">
            </Style>
        </DataGrid.ItemContainerStyle>
    </DataGrid>
</Grid>

Свойство IsShown явно находится на стороне модели представления. Если вы не удовлетворены таким решением, попробуйте добавить другой прокси-клиент следующим образом:

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.Resources>
            <utils:BindingProxy x:Key="BindingProxy" Data="{Binding}" />
        </DataGrid.Resources>
        ...

с использованием класса Freezable - объекты Freezable могут наследовать DataContext, даже если они не находятся в визуальном или логическом дереве. Таким образом, мы можем воспользоваться этим для нашего использования.

0 голосов
/ 30 октября 2018

взгляните на скрыть столбец шаблона сетки данных, когда он пуст

может быть, это то, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...