根据绑定的布尔值更改图像源

Change the image source based on binded boolean

我有联系人 class:

public class Contact
{
    public Contact(Contact contact)
    {
        this.Username = contact.Username;
        this.GUID = contact.GUID;
        this.Msg = contact.Msg;
        this.Ring = contact.Ring;
    }

    public string Username { get; set; }
    public Guid GUID { get; set; }
    public bool Msg { get; set; }
    public bool Ring { get; set; }
}

这是xaml:

        <ListView Grid.Row="1" Grid.Column="0" Name="ContactsListView" 
                      IsItemClickEnabled="True" 
                      ItemsSource="{x:Bind m_Client.Contacts}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="data:Contact">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{x:Bind Username}" VerticalAlignment="Center" />
                    // HERE SHOULD BE THE <Image> THAT SHOULD BE BOUND TO THE Msg PROPERTY
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我需要完成的是当 Msg boolean 为真时,图像源为一张图像,而当 Msg boolean 为 false 时图像源更改为第二张图像。

编辑: 我创建了这个 class:

namespace ContactsListBinding.Models
{
    public class MyImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return (bool)value ? new BitmapImage(new Uri("ms-appx:///Assets/true.png")) : new BitmapImage(new Uri("ms-appx:///Assets/false.png"));
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}

这是XAML:

<Page
    x:Class="ContactsListBinding.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:ContactsListBinding"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:data="using:ContactsListBinding.Models"
    xmlns:namespace="ContactsListBinding.Models">

    <Page.Resources>
        <data:MyImageConverter x:Key="MyImageConverter" />
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Grid.Column="0" Name="AddContactButton" Content="Add Contact" Click="AddContactButton_Click" />
        <ListView Grid.Row="1" Grid.Column="0" Name="ContactsListView" 
                          IsItemClickEnabled="True" 
                          ItemsSource="{x:Bind m_Client.Contacts}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="data:Contact">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{x:Bind Username}" VerticalAlignment="Center" />
                        <Image Source="{x:Bind Msg, Converter={StaticResources MyImageConverter}}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

我做错了什么?

您应该创建实现 IValueConverter 接口的自定义转换器

public class MsgToImagePathCovnerter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var imagePath = "ms-appx:///Assets/1.jpg";
        var msg = (bool)value;
        if (msg)
        {
            imagePath = "ms-appx:///Assets/2.jpg";
        }

        return imagePath;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在XAML中声明:

<local:MsgToImagePathCovnerter x:Key="MsgToImagePathCovnerter"/>

并在您的 DataTemplate 中使用:

        <DataTemplate x:DataType="data:Contact">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{x:Bind Username}" VerticalAlignment="Center" />
                <Image Source="{x:Bind Msg, Converter={StaticResource MsgToImagePathCovnerter}"/>
            </StackPanel>
        </DataTemplate>

创建转换器:

public class MyImageConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, string language)
   {
      return (bool)value ? new BitmapImage(new Uri("trueImagePath")) : new BitmapImage(new Uri("falseImagePath"));
   }

   public object ConvertBack(object value, Type targetType, object parameter, string language)
   {
      throw new NotImplementedException();
   }
}

您还需要向页面添加资源:

<Page.Resources>
   <namespace:MyImageConverter x:Key="MyImageConverter" />
</Page.Resources>

然后像这样添加图像控件:

<Image Source="{x:Bind Msg, Converter="{StaticResources MyImageConverter}"}" />

使用Trigger,代码短

<ListView.ItemTemplate>
    <DataTemplate x:DataType="data:Contact">
         <StackPanel Orientation="Horizontal">
               <TextBlock Text="{x:Bind Username}" VerticalAlignment="Center" />
               <Image Source="false.png">
                    <Image.Triggers>
                         <DataTrigger TargetType="Image" Binding="{x:Bind Msg}" Value="True">
                              <Setter Property="Source" Value="true.png" />
                          </DataTrigger>
                     </Image.Triggers>
               </Image>
         </StackPanel>
   </DataTemplate>
</ListView.ItemTemplate>