C# 如何基于绑定值-UWP更改listview项的图像

C# 如何基于绑定值-UWP更改listview项的图像,c#,xaml,listview,uwp,C#,Xaml,Listview,Uwp,我有一个listview,它使用可观察集合绑定值。listview包含一个带有图像和文本的按钮。基于文本值,我想改变按钮的背景色,还需要改变图像的来源。我怎样才能做到这一点 <ListView ItemsSource="{x:Bind ShopArray}"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:CurrentShopList2"> &l

我有一个listview,它使用可观察集合绑定值。listview包含一个带有图像和文本的按钮。基于文本值,我想改变按钮的背景色,还需要改变图像的来源。我怎样才能做到这一点

<ListView ItemsSource="{x:Bind ShopArray}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:CurrentShopList2">
            <Button Background="Green" >
                <Grid>
                    <TextBlock Foreground="Black" FontWeight="Bold" Text="{x:Bind IsBooksAvailable}"/>
                    <Image  Source="/Assets/booksAvailable.png" Stretch="None" />
                </Grid>
            </Button>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


如果
IsBooksAvailable=“Yes”
,我想将按钮的背景色更改为绿色,将图像源更改为
/Assets/booksAvailable.png
。如果
的值为IsBooksAvailable=“No”
我想将按钮的背景色更改为红色并隐藏图像按钮。

对于按钮,您需要一个IValueConverter。应该是这样的:

public class BoolToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {

           if ((bool)value)            
               return new SolidColorBrush(Color.FromArgb(255, 0, 255, 0));
           else
               return new SolidColorBrush(Color.FromArgb(255, 255, 0, 0));
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
将按钮的颜色属性绑定到此转换器提供的ISBooks

对于图像,可以执行相同的操作,将源属性绑定到文本字段,并在必要时使用转换器将文本调整为正确的路径。
但我更喜欢将图像存储在ObservaleCollection的byte[]属性中,并使用ByteArrayToImageConverter

这是另一种溶液——用XAML制成的纯溶液。除了上述行为外,还可以使用VisualStateManager执行此操作:


您可以查看整个示例。

Hi nsds:查看一下=>这里的(bool)值是多少?如何检查文本“是”或“否”?您可以将按钮的背景属性绑定到IsBooksAvailable。这毫无意义,因为布尔不能是画笔。所以我们使用一个转换器。在convert方法中,该值是绑定到的值,在本例中是可用的。值是一个对象,所以我们必须将它转换为布尔值。然后,如果为真,则返回绿色,如果为假,则返回红色。这就是xaml中的按钮应该是什么样子:但是请注意,您必须在xamlIn的资源中定义转换器。我的案例“是”或“否”不是布尔值。它们是字符串值。在“if((bool)value)”的位置,我想检查它是否等于“Yes”/“No”。哦,对不起,我假设它是bool。因此,您只需转换为字符串并写入:if((string)value==“Yes”)。转换器的其余部分可以相同,但我建议捕获null和一个不是“yes”或“no”的字符串
<ListView ItemsSource="{x:Bind ShopList}">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:ShopItem">
            <UserControl>
                <Button Click="Button_Click">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="AvailableStates">
                            <VisualState x:Name="Default"/>
                            <VisualState x:Name="Available">
                                <VisualState.Setters>
                                    <Setter Target="ItemGrid.Background" Value="Green"/>
                                    <Setter Target="ItemImage.Source" Value="/Assets/Tick.png"/>
                                </VisualState.Setters>
                                <VisualState.StateTriggers>
                                    <StateTrigger IsActive="{x:Bind IsBookAvailable, Mode=OneWay}"/>
                                </VisualState.StateTriggers>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid x:Name="ItemGrid">
                        <TextBlock Foreground="Black" FontWeight="Bold" Text="{x:Bind Title}"/>
                        <Image x:Name="ItemImage" Source="/Assets/NotAvailable.png" Stretch="None" />
                    </Grid>
                </Button>
            </UserControl>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>