Как скрыть контейнер данных с помощью DataTrigger, если в нем нет элементов - PullRequest
2 голосов
/ 07 января 2012

У меня есть сетка данных, которая связывает свои данные из SelectedItem TreeView.

Проблема в том, как автоматически скрыть контейнер сетки, используя DataTrigger , если в сетке данных нет элементов ?

    <Grid Name="grid1" Visibility="Visible">
       <DataGrid Name="datagrid1" ItemsSource="{Binding ElementName=treeview1, Path=SelectedItem}"/>
    </Grid>

Я думаю, что эта ссылка может оказаться полезной.

Ответы [ 4 ]

5 голосов
/ 03 июля 2013

Этот триггер данных работал для меня:

<Style TargetType="{x:Type DataGrid}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Items.Count, RelativeSource={RelativeSource Self}}" Value="0">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
    </Style.Triggers>
</Style>
3 голосов
/ 07 января 2012

Вы можете привязать свойство HasItems к сетке данных. Но поскольку это свойство является логическим типом, а Grid.Visibility является перечислением Visibility, вам необходимо преобразовать логическое значение в enum. К счастью, уже есть готовый конвертер BooleanToVisibilityConverter.

<Grid Name="grid1" Visibility="{Binding HasItems, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=datagrid1, Mode=OneWay}">

Не уверен, почему вы хотите использовать DataTrigger, но если вы хотите применить переходы при изменении видимости, вы можете сделать это, стилизовав сетку и добавив триггер для Visibility = Visible, например, так:

<Style x:Key="GridStyle1" TargetType="{x:Type Grid}">
        <Style.Resources>
            <Storyboard x:Key="StoryboardShow">
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="{x:Null}">
                    <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="StoryboardHide">
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="{x:Null}">
                    <SplineDoubleKeyFrame KeyTime="0" Value="1"/>
                    <SplineDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </Style.Resources>
        <Style.Triggers>
            <Trigger Property="Visibility" Value="Visible">
                <Trigger.ExitActions>
                    <BeginStoryboard Storyboard="{StaticResource StoryboardHide}"/>
                </Trigger.ExitActions>
                <Trigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource StoryboardShow}"/>
                </Trigger.EnterActions>
            </Trigger>
        </Style.Triggers>
    </Style>

Затем примените этот стиль к сетке:

<Grid Name="grid1" Style="{DynamicResource GridStyle1}" Visibility="{Binding HasItems, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=datagrid1, Mode=OneWay}">
0 голосов
/ 17 апреля 2017
<Style TargetType="{x:Type DataGrid}">    
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGrid}">
                <Border Background="{TemplateBinding Background}"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="2"
            CornerRadius="1"
            Padding="{TemplateBinding Padding}"
            SnapsToDevicePixels="True">
                    <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
                        <Grid>
                            <ItemsPresenter x:Name="ScroItemsPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            <TextBlock x:Name="Block" Text="asd"></TextBlock>
                        </Grid>
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" 
                                 Value="True">
                        <Setter TargetName="Block" Property="Visibility" Value="Hidden"></Setter>
                        <Setter TargetName="ScroItemsPresenter" Property="Visibility" Value="Visible"></Setter>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

HasItems: нет товаров:

0 голосов
/ 07 января 2012

Проверьте источник данных в коде позади, во время события загрузки страницы.Если источник данных пуст (в соответствии с вашими критериями), тогда установите datagrid1.visible = false.Для полноты информации установите значение true, если вы найдете данные, достойные отображения.

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