Триггер, чтобы скрыть текст, когда источником изображения является действительным (не null)

Итак, у меня есть DataGrid с графическим столбцом, и я хочу иметь возможность скрыть " обзор..."гиперссылка, когда изображение имеет действительный (ненулевой) источник. Как это можно сделать?
Вот мой XAML:
<DataGridTemplateColumn Header="Image">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Command="{Binding ChangeImageCommand}">
<Button.Template>
<ControlTemplate>
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
<Hyperlink Command="{Binding ChangeImageCommand}">Browse...</Hyperlink>
</TextBlock>
<Image Source="{Binding Image}" Margin="0"/>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
О, и если есть более простой способ получить кнопку изображения с альтернативным текстом, пожалуйста, дайте мне знать! :- )
2 ответов:
Сделать TextBlock невидимым по умолчанию и записать триггер для
Image.Source == nullЧто-то вроде:
<DataGridTemplateColumn Header="Image"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Command="{Binding ChangeImageCommand}"> <Button.Template> <ControlTemplate> <Grid> <TextBlock Name="TextBlock" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"> <Hyperlink Command="{Binding ChangeImageCommand}">Browse...</Hyperlink> </TextBlock> <Image Name="Image" Source="{Binding Image}" Margin="0"/> </Grid> <ControlTemplate.Triggers> <Trigger SourceName="Image" Property="Source" Value="{x:Null}"> <Setter TargetName="TextBlock" Property="Visibility" Value="Visible"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
Вы можете использовать ValueConverter для привязки изображения к видимости. Простой конвертер, который работает на основе null, будет выглядеть следующим образом:
public class VisibilityConverter : IValueConverter { public Visibility True { get; set; } public Visibility False { get; set; } public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (value != null ? True : False); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }Вы можете создать несколько экземпляров этого в ваших ресурсах XAML, чтобы использовать их для управления видимостью элементов. Кроме того, вам не нужно создавать шаблон кнопки, так как кнопки WPF могут содержать все, что вы хотите (не только текст). Таким образом, ваш XAML может выглядеть примерно так:
<Window.Resources> <loc:VisibilityConverter x:Key="ImageConverter" True="Visible" False="Collapsed"/> <loc:VisibilityConverter x:Key="BrowseConverter" True="Collapsed" False="Visible"/> </Window.Resources> . . . <DataGridTemplateColumn Header="Image"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Command="{Binding ChangeImageCommand}"> <Grid> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding Image, Converter={StaticResource BrowseVisibility}}"> Browse... </TextBlock> <Image Source="{Binding Image}" Margin="0" Visibility="{Binding Image, Converter={StaticResource ImageVisibility}}"/> </Grid> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>Обратите внимание, что вам также потребуется создайте пространство имен loc в верхней части XAML. И я предполагал, что вы разместите их в своих оконных ресурсах.
Comments