Как переопределить видимость метки? - PullRequest
0 голосов
/ 05 июля 2018

Я хочу скрыть видимость метки для другого контента, предположим, у меня есть GroupBox, который содержит DataGrid:

<GroupBox>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>

Я хочу вставить Label, который появляется только тогда, когда я прячу DataGrid, поэтому я попробовал простое StackPanel:

<GroupBox>
  <StackPanel Orientation="Vertical">
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" />
  </StackPanel>
</GroupBox>

поэтому я попытался установить видимость DataGrid за кодом, например:

Dt.Visibility = Visibility.Hidden;

это скроет DataGrid, но основной проблемой является метка, фактически метка даже видима, даже если Dt видимый.

Как отобразить метку, только если DataGrid скрыт?

Ответы [ 5 ]

0 голосов
/ 05 июля 2018

Вы можете использовать свойство Visibility элемента Datagrid и назначить метку, когда сетка видима, метка также будет видимой.

<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />
0 голосов
/ 05 июля 2018

Вы можете связать видимость метки с видимостью сетки данных и использовать конвертер, который переключает значение :

<GroupBox>
  <StackPanel Orientation="Vertical">
    <StackPanel.Resources>
         <local:VisibilityInverter x:key="VisInverter"/>
    </StackPanel.Resources>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" Visibility="{Binding Path=Visibility, ElementName=Dt, Converter={StaticResource VisInverter}}" />
  </StackPanel>
</GroupBox>

Здесь конвертер :

public class VisibilityInverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Hidden;

        if (value == Visibility.Visible)
            return Visibility.Hidden;

        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, ultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
0 голосов
/ 05 июля 2018

Вы можете по умолчанию видимость метки по умолчанию скрыта, а в коде позади, когда DataGrid скрыт любым способом, который вы настраиваете, вы устанавливаете видимость метки как Visible

XAML:

<GroupBox>
  <StackPanel Orientation="Vertical">
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
    <Label Content="Foo" Visibility="Hidden" x:Name="fooLabel" />
  </StackPanel>
</GroupBox>

Код сзади:

private void yourMethod(object sender, RoutedEventArgs e)
{
    Dt.Visibility = Visibility.Hidden;
    fooLabel.Visibility = Visibility.Visible;
}
0 голосов
/ 05 июля 2018

Вы можете применить Style к Label с DataTrigger, который привязывается к свойству Visibility DataGrid:

<GroupBox>
    <StackPanel Orientation="Vertical">
        <DataGrid x:Name="Dt" Visibility="Collapsed">
            <DataGrid.Columns>
                <DataGridTextColumn Header="home" />
            </DataGrid.Columns>
        </DataGrid>
        <Label Content="Foo">
            <Label.Style>
                <Style TargetType="Label">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Visibility, ElementName=Dt}" Value="Visible">
                            <Setter Property="Visibility" Value="Collapsed" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Label.Style>
        </Label>
    </StackPanel>
</GroupBox>

Используя этот подход только XAML, вы можете привязать любое свойство DataGrid. Например, вы можете привязать свойство HasItems и отображать Label только тогда, когда DataGrid пусто. Конвертеры не нужны.

0 голосов
/ 05 июля 2018

используйте панель Grid и поместите метку перед DataGrid. Они расположены в одной ячейке сетки, и это гарантирует, что метка будет закрыта DataGrid, когда она будет видимой.

<GroupBox>
  <Grid>
    <Label Content="Foo" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
  </Grid>
</GroupBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...