更改单个列表的颜色<;T>;项目

本文关键字:lt gt 项目 颜色 单个 列表 | 更新日期: 2023-09-27 18:22:38

我正试图在触发时更改项目的字体颜色,但我一生都无法找出语法来更改单个项目。我的代码:

C#:

public class Person
{
    public string Name { get; set; }
    public string Mode { get; set; }
    public string Time { get; set; }
}
List<Person> personObjects = new List<Person>();
personObjects.Add(new Person()
{
    Name = testVariable,
    Mode = "Test",
    Time = testString1,
});
PersonListView.ItemsSource = personObjects;

XAML:

<ListView x:Name="PersonListView" 
          HorizontalAlignment="Left" 
          Height="258"
          Margin="5,268,0,0"
          VerticalAlignment="Top"
          Width="165" 
          FontSize="10"
          ButtonBase.Click="GridViewColumnHeaderClickedHandler" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Height" Value="16" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Person" 
                            Width="94"
                            DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Time" 
                            Width="44"
                            DisplayMemberBinding="{Binding Time}"/>
        </GridView>
    </ListView.View>
</ListView>

我尝试过使用ListViewItem属性,但没有成功

我试过:

foreach (Person item in onCallListView.Items)
{
    if(trigger)
    {
       item.Foreground = Brushes.Red;
    }
}

我得到的最接近的是在XAML中更改它:

<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Foreground" Value="Red" />
</Style>

但它会更改列表中的所有项目,我如何单独更改这些项目

我有一个可以直接改变颜色的标签:

int secondsInMode = Convert.ToInt32(pullsDataFromString);
if (secondsInMode > 15 * 60)
   {
    personStatusLabel.Foreground = Brushes.Red;
   }

我可以使用一个类似于的布尔值吗

public bool RED = false;
if (secondsInMode > 15 * 60)
   {
    RED = true;
   }

并且是否由布尔值触发DataTrigger?

更改单个列表的颜色<;T>;项目

您可以这样触发它:

            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Height" Value="16" />
                <DataTrigger Binding="{Binding Time}" Value="456">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
            </Style>

如果你的trigger不仅仅是some_property == some_value,那么你要么需要创建自己的ValueConverter(见下面的编辑)

如果您绑定的属性也可以动态更改,那么您还需要在属性上实现PropertyChanged-请参阅http://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx

祝你好运!任何问题都可以问。

添加-如何制作转换器:

如果你需要一个更复杂的触发器,你可以这样做:

C#:

public class TimeStringToIsLateConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        // Do the conversion from your Time (ie value) to your "should the text be red" bool
        return ((string)value) == "456";
    }
    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        // Not needed!
        return null;
    }
}

XAML:

在顶部添加您的本地命名空间,例如:

<Window ...
    xmlns:l="clr-namespace:WpfApplication4"
    ... />

然后有一些东西,例如:

    <ListView ...>
        <ListView.Resources>
            <l:TimeStringToIsLateConverter x:Key="TimeColourConverter" />
        </ListView.Resources>
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Height" Value="16" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Time, Converter={StaticResource TimeColourConverter}}" Value="True">
                        <Setter Property="Foreground" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
        ...