【问题标题】:Show alternating images for changing ViewModel states显示用于更改 ViewModel 状态的交替图像
【发布时间】:2013-05-14 20:04:45
【问题描述】:

对于不同的用户界面,我想根据 ViewModel 对象的状态显示图像。

例如:

我有一个数据库连接,如果连接,我想显示一个绿色的数据库图像,如果没有连接我想显示一个红色的数据库图像。

在 ViewModel 中有一个 bool 代表状态。

可能性是:

  • 在视图中有两个图像(红色图像有一个转换器 InverseBooleanToVisibilityConverter),它们在同一个位置,实际上只显示其中一个。

  • Image source 的绑定(但我不想在我的 ViewModel 中设置它)

  • 某种选择器?

这种依赖于状态的图像可能更常用,例如在TreeView 中作为ItemImage

有没有更聪明的方法来做到这一点?

【问题讨论】:

    标签: c# wpf image xaml mvvm


    【解决方案1】:

    您也可以仅使用数据触发器来实现。这是我的一个项目中的一个示例,该按钮根据表单是否处于编辑模式来更改其图像:

    <Button x:Name="EditOrSaveJob"
                        Width="32"
                        Height="32"
                        Margin="10,0,0,0"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch">
                    <Image>
                        <Image.Style>
                            <Style TargetType="Image">
                                <Setter Property="Source" Value="/AAAA;component/Resources/Images/edit.png" />
                                <Setter Property="ToolTip" Value="Edit Order" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsEditing}" Value="True">
                                        <Setter Property="Source" Value="/AAAA;component/Resources/Images/32_save.png" />
                                        <Setter Property="ToolTip" Value="Save Order" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
    </Button>
    

    【讨论】:

    • 一个全 XAML 解决方案在我看来非常好,因为这个问题完全是特定于视图的。谢谢!
    • 在某些情况下我肯定会使用这个,但我只能接受一个答案,请原谅。
    【解决方案2】:

    我使用这样的值转换器:

    public class BoolToImageConverter: DependencyObject, IValueConverter
    {
    
        public BitmapImage TrueImage
        {
            get { return (BitmapImage)GetValue(TrueImageProperty); }
            set { SetValue(TrueImageProperty, value); }
        }
        public static DependencyProperty TrueImageProperty = DependencyProperty.Register("TrueImage", typeof(BitmapImage), typeof(BoolToImageConverter), null);
    
    
        public BitmapImage FalseImage
        {
            get { return (BitmapImage)GetValue(FalseImageProperty); }
            set { SetValue(FalseImageProperty, value); }
        }
        public static DependencyProperty FalseImageProperty = DependencyProperty.Register("FalseImage", typeof(BitmapImage), typeof(BoolToImageConverter), null);
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (bool)value ? TrueImage : FalseImage;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var img = (BitmapImage)value;
            return img.UriSource.AbsoluteUri == TrueImage.UriSource.AbsoluteUri;
        }
    
    }
    

    在 XAML 中

    <my:BoolToImageConverter x:Key="converterName" FalseImage="{StaticResource falseImage}" TrueImage="{StaticResource trueImage}"/>
    

    【讨论】:

    • 我真的很喜欢这样,因为它很容易与类似枚举的状态一起使用,而不仅仅是布尔值,xaml 保持简洁。
    • 这就是我想要的。非常感谢!
    【解决方案3】:

    解决方案是使用转换器(实现 IValueConverter 的类):

    class ImageStateConverter : IValueConverter
    {
        public Object Convert(  Object value, Type targetType, Object parameter,    CultureInfo culture)    
        {
            bool state = (bool) value;
            return state ? "img1.png" : "img2.png";
        }
    }
    

    然后在你的 XAML 中编写这样的绑定:

    <Image Source="{Binding Path=State, Converter={StaticResource myConverter}}" />
    

    对象 myConverter 在资源部分的某处声明。

    【讨论】:

    • 我不喜欢这种方法的原因是它不可重复使用,并且每次需要切换新图像时都会得到一个新类型。你可以通过使用虚拟/抽象属性而不是硬编码的字符串常量来使​​它更好一点。
    • 想了一些像这样的转换器,但我想在 XAML 中引用我的图像文件,别无他处。谢谢你的回答。
    • 我只想展示 wpf 转换器的工作原理,当然在实际代码中您应该公开每个图像文件引用的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多