UWP将Listview项目前景绑定到属性

时间:2018-02-08 13:22:02

标签: c# data-binding uwp

我想根据这些项的属性更改ListView中某些项的前景。如果该物品具有属性" EsBlacklist"设置为true,其前景应为红色。

<Page.Resources>
    <converter:ForegroundColorConverter x:Key="ForegroundConverter" x:Name="ForegroundConverter"/>
</Page.Resources>

<StackPanel Grid.Column="1" Grid.Row="1">
            <TextBlock HorizontalAlignment="Center" Margin="10" FontSize="24">Vehículos sin VTV</TextBlock>
            <ListView ItemsSource="{x:Bind ViewModel.PatentesSinVtv}" Margin="10" DisplayMemberPath="Placa" 
                      SelectedItem="{x:Bind ViewModel.PatenteSeleccionada, Mode=TwoWay}"
            HorizontalAlignment="Center"
            IsItemClickEnabled="False"
            IsSwipeEnabled="False"
            CanDragItems="False"
            SelectionMode="Single"
            Grid.Column="1"
            Grid.Row="1">
                <ListViewItem Foreground="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ForegroundConverter}}"></ListViewItem> 
( Self should reference the item and not ListViewItem.)
            </ListView>    
</StackPanel>

转换器:

class ForegroundColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            var patente = (Patente)value; //value is not a Patente but ListViewItem
            return patente.EsBlacklist ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Gray);
        }
    }

我的问题是&#34;价值&#34;在转换器中收到的不是Patente而是ListViewItem

4 个答案:

答案 0 :(得分:1)

  

我的问题是转换器中收到的“值”不是Patente而是ListViewItem

作为{RelativeSource} markup extension的文件,

  

{RelativeSource Self}生成Self Mode值。目标元素应该用作此绑定的源。这对于将元素的一个属性绑定到同一元素上的另一个属性非常有用。   ...

     

自我模式可用于将元素的一个属性绑定到同一元素上的另一个属性,并且是ElementName绑定的变体,但不需要命名,然后自引用该元素。

以下是使用RelativeSource={RelativeSource Self}

的示例
<Rectangle
  Fill="Orange" Width="200"
  Height="{Binding RelativeSource={RelativeSource Self}, Path=Width}"/>

您可以查看该文档以了解如何使用{RelativeSource} markup extension

您可以直接绑定ViewModel以使转换器成为Patente,

<ListViewItem Foreground="{x:Bind ViewModel, Mode=TwoWay, Converter={StaticResource ForegroundConverter}}"/>

答案 1 :(得分:0)

前景色的值不是纯色,而是画笔。 因此,您的转换器应返回new SolidColorBrush(Colors.Red)

答案 2 :(得分:0)

您可以这样处理:

<ListViewItem>
    <ListViewItem.Foreground>
        <SolidColorBrush Color="{x:Bind YourColor}"/>
    </ListViewItem.Foreground>
</ListViewItem>

答案 3 :(得分:0)

我需要实现一个ItemTemplate

<ListView.ItemTemplate>
    <DataTemplate x:DataType="modelo:Patente">
        <TextBlock Text="{Binding Placa}" Foreground="{x:Bind EsBlacklist, Mode=TwoWay, Converter={StaticResource ForegroundConverter}}"></TextBlock>
    </DataTemplate>
</ListView.ItemTemplate>

并且转换器变为:

public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (bool)value? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Gray);
    }