【问题标题】:Bind Image.Source according to Boolean without a converter?在没有转换器的情况下根据布尔值绑定 Image.Source?
【发布时间】:2010-12-12 16:10:59
【问题描述】:

我希望将图像绑定到布尔值并让图像的源依赖于布尔值

即真源="image1" 假源="image2"

我想知道是否有办法在不需要转换器的情况下内联。

【问题讨论】:

    标签: wpf binding conditional boolean-expression converters


    【解决方案1】:

    您可以在 Image 上创建一个样式,该样式使用 DataTrigger 根据绑定交换图像源。在此示例中,图像根据简单称为“Value”的布尔值的值而变化。

        <Image Width="16">
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Value}" Value="False">
                            <Setter Property="Source" Value="Resources/image1.png"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Value}" Value="True">
                            <Setter Property="Source" Value="Resources/image2.png"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    

    【讨论】:

    • 这是否适用于不同元素的属性?例如,如果我想根据标签的值绑定图像,那会以同样的方式工作吗?你能详细说明一下吗?
    【解决方案2】:

    如果有人正在寻找用于绑定的值转换器。这是我用的

    <Image Source="{Binding Converter={StaticResource ImageConverter},ConverterParameter=\{Status\}}" />
    
    public class StatusToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string statusValue = parameter.ToString().ToUpper();
    
            if (!string.IsNullOrEmpty(statusValue))
            {
                string result = string.Empty;
    
                switch (statusValue)
                {
                    case "IDLE":
                        result = "idle.png";
                        break;
                    case "OFFLINE":
                        result = "offline.png";
                        break;
                    default:
                        result = "online.png";
                        break;
                }
    
                var uri = new Uri("pack://application:,,,/PIE;component/Images/" + result);
    
                return uri;
            }
    
            return string.Empty;
        }
    
        // No need to implement converting back on a one-way binding
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }
    

    有界枚举

    public enum DevStatus 
    { 
       Idle = 1,
       Offline = 2, 
       Active = 3, 
    }
    

    从 ViewModel 设置 Enum,转换器将绑定相应的图像。

    <Image Source="{Binding DevStatus, Converter={StaticResource ImageConverter}}" />
    

    【讨论】:

    • 您能解释一下 ConverterParameter=\{Status\} 部分吗?
    • 在我的例子中它是一个枚举值 public enum DeviceStatus { Idle = 1, Offline = 2, Active = 3, }
    • 你用过MVVM模型吗?如果是,您是否将这些详细信息放入视图模型中?还是在视图中?
    【解决方案3】:

    如果您只是直接绑定Image::Source 属性,那么完成此操作的唯一方法是使用自定义IValueConverter

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2015-08-29
      • 1970-01-01
      • 2013-09-18
      • 2013-05-27
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多