есть ListBox
<ListBox x:Name="autoList" Grid.Column="0" ItemsSource="{Binding Auto}"
SelectedItem="{Binding SelectedAuto}">
в нем из базы загружаются автомобили.
как сделать чтобы если база пуста(удалены все элементы или еще не заполнялась) ListBox заменялся на это
<TextBlock Text="Список пуст. Введите данные" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
Можно сделать с помощью DataTrigger без дополнительных свойств и конверторов:
<Grid>
<ListBox ItemsSource="{Binding Auto}"/>
<Label Content="Список пуст">
<Label.Style>
<Style TargetType="Label">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Auto.Count}" Value="0">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</Grid>
ListBox и Label должны находится в одном Grid(или хотя бы в одной ячейке) чтобы происходило наложение друг на друга.
Сначала напишем конвертер, который является отражением BooleanToVisibilityConverter:
public class InverseBooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
После этого дополним модель представления признаком наличия автомобилей:
class ViewModel
{
...
public bool HasAuto
{
get { return Auto.Any(); }
}
}
После этого добавим обработку видимости в представление:
<StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
<local:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter" />
</StackPanel.Resources>
<ListBox Visibility="{Binding HasAuto, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BooleanToVisibilityConverter}}"
ItemsSource="{Binding Auto}" SelectedItem="{Binding SelectedAuto}" />
<TextBlock Text="Список пуст. Введите данные" Visibility="{Binding HasAuto, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource InverseBooleanToVisibilityConverter}}" />
</StackPanel>
Остается только вовремя обновлять свойство HasAuto путем вызова PropertyChanged. Это можно сделать подписавшись на событие изменения коллекции Auto. Или можно вызывать событие PropertyChanged при загрузке, добавлении и удалении элементов из коллекции. Тогда подписка на событие изменения состава коллекции не понадобится.
UPD
Ну или можно воспользоваться триггерами (свойство HasAuto все равно понадобится)
<ContentPresenter Content="{Binding}">
<ContentPresenter.Resources>
<DataTemplate x:Key="AutoListTemplate">
<ListBox ItemsSource="{Binding Auto}" SelectedItem="{Binding SelectedAuto}" />
</DataTemplate>
<DataTemplate x:Key="EmptyAutoListTemplate">
<TextBlock Text="Список пуст. Введите данные" />
</DataTemplate>
</ContentPresenter.Resources>
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<DataTrigger Binding="{Binding HasAuto, UpdateSourceTrigger=PropertyChanged}" Value="False">
<Setter Property="ContentTemplate" Value="{StaticResource EmptyAutoListTemplate}"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="ContentTemplate" Value="{StaticResource AutoListTemplate}" />
</Style>
</ContentPresenter.Style>
</ContentPresenter>
1. Объявите:
public ObservableCollection<string> Auto
2. В разметке:
<TextBlock Text="{Binding Auto.Count}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Auto.Count}" Value="0">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
3. Аналогично Auto (только поменять Hidden/Visible)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники