MAUI中DevExpress DataGridView图片依IsInLocalCache控制显示
解决方案
问题根源
你当前的IsVisible绑定写法错误,Source={x:Reference IsInLocalCache}试图引用一个名为IsInLocalCache的控件,但IsInLocalCache是Document对象的属性,并非控件,因此绑定无法生效。以下是几种可行的实现方式:
方式一:直接绑定属性
直接将Image的IsVisible绑定到当前行数据(即Document对象)的IsInLocalCache属性,这是最简单的实现:
<dxg:TemplateColumn Row="1" Column="3" ColumnSpan="1" Caption="Icon" IsReadOnly="true" AllowSort="False"> <dxg:TemplateColumn.DisplayTemplate> <DataTemplate> <!-- 绑定当前DataContext(Document实例)的IsInLocalCache属性 --> <Image Source="icon.svg" IsVisible="{Binding IsInLocalCache}" /> </DataTemplate> </dxg:TemplateColumn.DisplayTemplate> </dxg:TemplateColumn>
方式二:使用布尔值转可见性转换器(适用于需反向逻辑的场景)
如果后续需要调整显示逻辑(比如IsInLocalCache为false时显示图片),可以使用转换器:
- 先实现转换器类:
public class BooleanToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value is bool isVisible && isVisible ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value is Visibility visibility && visibility == Visibility.Visible; } }
- 在页面资源中声明转换器:
<ContentPage.Resources> <local:BooleanToVisibilityConverter x:Key="BoolToVis" /> </local:ContentPage.Resources>
- 绑定转换器:
<Image Source="icon.svg" IsVisible="{Binding IsInLocalCache, Converter={StaticResource BoolToVis}}" />
方式三:使用DataTrigger控制显示
通过触发器根据IsInLocalCache的值动态设置可见性:
<dxg:TemplateColumn Row="1" Column="3" ColumnSpan="1" Caption="Icon" IsReadOnly="true" AllowSort="False"> <dxg:TemplateColumn.DisplayTemplate> <DataTemplate> <Image Source="icon.svg"> <Image.Triggers> <!-- 当IsInLocalCache为false时,隐藏图片 --> <DataTrigger TargetType="Image" Binding="{Binding IsInLocalCache}" Value="False"> <Setter Property="IsVisible" Value="False" /> </DataTrigger> </Image.Triggers> </Image> </DataTemplate> </dxg:TemplateColumn.DisplayTemplate> </dxg:TemplateColumn>
补充说明
如果IsInLocalCache属性会动态变更,需要让Document类实现INotifyPropertyChanged接口,否则属性值变化后UI不会自动更新:
public class Document : INotifyPropertyChanged { [Key] [SQLite.PrimaryKey, AutoIncrement] public Guid DocId { get; set; } [Required] public DocStatusEnum Status { get; set; } private bool _isInLocalCache; [SQLite.Ignore] public bool IsInLocalCache { get => _isInLocalCache; set { if (_isInLocalCache != value) { _isInLocalCache = value; OnPropertyChanged(); } } } = false; public DateTime? LastChangeDateTime { get; set; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

