Удалить строку, если привязанное к текстовому блоку значение равно null

97
5

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

<ListBox VerticalAlignment="Stretch"
ItemsSource="{Binding EventInfo}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Event:" FontWeight="Bold" Grid.Column="0" Grid.Row="0"/>
<TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="1" Grid.Row="0"/>
<TextBlock Text="Foo:" FontWeight="Bold" Grid.Column="0" Grid.Row="1"/>
<TextBlock Text="{Binding Foo}" FontWeight="Bold" Grid.Column="1" Grid.Row="1"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

поэтому мне нужно скрыть все строки, содержащие textblock/s с нулевым или пустым значением, на самом деле мне это удалось в чистом xaml:

<ListBox.Resources>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.Resources>

но это нехорошее решение. Infact, как вы можете видеть, каждый textblock организован по строке и столбцу, поэтому мне нужно скрыть строку, содержащую текстовый блок с нулевым значением.

С моим решением я скрываю только текстовый блок с нулевым значением, что бесполезно, потому что значение уже пусто или равно нулю.

Есть возможность управлять им через xaml? Я понятия не имею, как это сделать в xaml, потому что, если я скрою строку в середине, например, я получу пустое пространство с строкой, содержащей текстовые блоки с ненулевым значением. Я не знаю, ясно ли ситуация.

Если что-то неясно, спросите, и я попытаюсь объяснить лучше. Благодарю.

спросил(а) 2016-09-03T17:10:00+03:00 4 года назад
1
Решение
70

Вы можете установить серию строк сетки соответственно

замещать

<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>

с

<Grid.RowDefinitions>
<RowDefinition>
<RowDefinition.Style>
<Style TargetType="RowDefinition">
<Style.Triggers>
<DataTrigger Binding="{Binding Name}" Value="">
<Setter Property="Height" Value="0" />
</DataTrigger>
<DataTrigger Binding="{Binding Name}" Value="{x:Null}">
<Setter Property="Height" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
<RowDefinition>
<RowDefinition.Style>
<Style TargetType="RowDefinition">
<Style.Triggers>
<DataTrigger Binding="{Binding Foo}" Value="">
<Setter Property="Height" Value="0" />
</DataTrigger>
<DataTrigger Binding="{Binding Foo}" Value="{x:Null}">
<Setter Property="Height" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
</Grid.RowDefinitions>

ответил(а) 2016-09-03T18:09:00+03:00 4 года назад
40

Вы пробовали конвертеры? Вы можете написать конвертер для видимости строки, например:

public class EmptyNotVisibleConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return String.IsNullOrEmpty(value as string) ? Visibility.Collapsed : Visibility.Visible;
}

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

public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null)
_converter = new EmptyNotVisibleConverter();
return _converter;
}

private static EmptyNotVisibleConverter _converter = null;
}

И используйте его на своей сетке следующим образом:

<Grid Visibility={Binding Name, Converter={local:EmptyNotVisibleConverter}}>

ответил(а) 2016-09-03T17:18:00+03:00 4 года назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема