数据触发器:如果数据可用则隐藏占位符
Data Triggers: Hide placeholder if data is available
目前我有两张图片:placeholder image,real image。如果真实图像的缩略图路径可用,我想隐藏占位符图像。因此我想我可以使用 Data Triggers:
<Image x:Name="placeholder" Aspect="AspectFit" HorizontalOptions="Center" WidthRequest="60" IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image"
Binding="{Binding ThumbnailFilePath}"
Value="{x:Null}">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image"
Binding="{Binding ThumbnailFilePath, Path=Text.Length}"
Value="0">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
</Image.Triggers>
</Image>
<Image x:Name="preview" Aspect="AspectFit" HorizontalOptions="Center" WidthRequest="60" Source="{Binding ThumbnailFilePath, Converter ={StaticResource ImageSourceConverter}}"/>
如果我这样做,我的列表视图中的某些项目根本没有图像 (ThumbnailFilePath = null;
)。对于某些显示缩略图,对于某些占位符。占位符的来源是在代码中设置的,因为有一些条件需要检查。通过在列表视图中滚动(项目离开视线然后返回),然后显示占位符。
如果路径更新,则两个图像应该相应可见:
ThumbnailFilePath = null;
ThumbnailFilepath = "path/to/file.jpg";
所需操作:占位符应消失,缩略图应显示。
ThumbnailFilePath = "old/path/to/file.jpg";
ThumbnailFilepath = "path/to/file.jpg";
所需操作:占位符应保持隐藏状态,应显示新缩略图。
ThumbnailFilePath = "path/to/file.jpg";
ThumbnailFilepath = null;
所需操作:占位符应可见,缩略图应隐藏。
这可以用数据触发器来管理吗?如何?
我尝试通过代码(代码隐藏文件)设置可见性,但列表视图中的项目未更新(显示占位符,尽管缩略图可用,只有在列表中滚动才能将缩略图带到正面)。
此外,我使用占位符是因为当我有一个绑定然后我在代码中更改图像源时,绑定就消失了...
<Image x:Name="placeholder"
BindingContext="{x:Reference Name=preview}"
Aspect="AspectFit"
HorizontalOptions="Center"
WidthRequest="60"
IsVisible="{Binding Path=Source, Converter ={StaticResource IsNullConverter}">
<Image x:Name="preview"
Aspect="AspectFit"
HorizontalOptions="Center"
WidthRequest="60"
Source="{Binding ThumbnailFilePath, Converter ={StaticResource ImageSourceConverter}}"/>
以上似乎有效。我还必须删除代码中 IsVisible
的所有手动设置。
这是我使用的IValueConverter
:
class IsNullOrEmptyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
return string.IsNullOrEmpty((string)value);
return (value == null);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException("IsNullOrEmptyConverter can only be used one way.");
}
}
目前我有两张图片:placeholder image,real image。如果真实图像的缩略图路径可用,我想隐藏占位符图像。因此我想我可以使用 Data Triggers:
<Image x:Name="placeholder" Aspect="AspectFit" HorizontalOptions="Center" WidthRequest="60" IsVisible="False">
<Image.Triggers>
<DataTrigger TargetType="Image"
Binding="{Binding ThumbnailFilePath}"
Value="{x:Null}">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
<DataTrigger TargetType="Image"
Binding="{Binding ThumbnailFilePath, Path=Text.Length}"
Value="0">
<Setter Property="IsVisible" Value="True" />
</DataTrigger>
</Image.Triggers>
</Image>
<Image x:Name="preview" Aspect="AspectFit" HorizontalOptions="Center" WidthRequest="60" Source="{Binding ThumbnailFilePath, Converter ={StaticResource ImageSourceConverter}}"/>
如果我这样做,我的列表视图中的某些项目根本没有图像 (ThumbnailFilePath = null;
)。对于某些显示缩略图,对于某些占位符。占位符的来源是在代码中设置的,因为有一些条件需要检查。通过在列表视图中滚动(项目离开视线然后返回),然后显示占位符。
如果路径更新,则两个图像应该相应可见:
ThumbnailFilePath = null;
ThumbnailFilepath = "path/to/file.jpg";
所需操作:占位符应消失,缩略图应显示。
ThumbnailFilePath = "old/path/to/file.jpg";
ThumbnailFilepath = "path/to/file.jpg";
所需操作:占位符应保持隐藏状态,应显示新缩略图。
ThumbnailFilePath = "path/to/file.jpg";
ThumbnailFilepath = null;
所需操作:占位符应可见,缩略图应隐藏。
这可以用数据触发器来管理吗?如何?
我尝试通过代码(代码隐藏文件)设置可见性,但列表视图中的项目未更新(显示占位符,尽管缩略图可用,只有在列表中滚动才能将缩略图带到正面)。
此外,我使用占位符是因为当我有一个绑定然后我在代码中更改图像源时,绑定就消失了...
<Image x:Name="placeholder"
BindingContext="{x:Reference Name=preview}"
Aspect="AspectFit"
HorizontalOptions="Center"
WidthRequest="60"
IsVisible="{Binding Path=Source, Converter ={StaticResource IsNullConverter}">
<Image x:Name="preview"
Aspect="AspectFit"
HorizontalOptions="Center"
WidthRequest="60"
Source="{Binding ThumbnailFilePath, Converter ={StaticResource ImageSourceConverter}}"/>
以上似乎有效。我还必须删除代码中 IsVisible
的所有手动设置。
这是我使用的IValueConverter
:
class IsNullOrEmptyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
return string.IsNullOrEmpty((string)value);
return (value == null);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new InvalidOperationException("IsNullOrEmptyConverter can only be used one way.");
}
}