使用数据绑定根据值设置标签背景的WPF方法

4

我目前在制作一个网格,每个单元格中都有一个标签,标签中的内容来自使用DataBinding的列表。 我正在尝试根据标签中的值更改每个单元格的颜色。例如,如果值为1,则背景必须是黑色。 以下是我目前的代码:

  <Window.Resources>
    <DataTemplate x:Key="DataTemplate_Level2">
        <Label Content="{Binding}"  Width="70" Height="70" HorizontalContentAlignment="Center">
        </Label>
    </DataTemplate>

    <DataTemplate x:Key="DataTemplate_Level1">
        <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DataTemplate>
</Window.Resources>

我尝试使用触发器的不同方法,但似乎都没有起作用。

如果能得到帮助将不胜感激。

谢谢。


1个回答

4

就像这样简单,但你需要复制和粘贴很多Setter标签。你可能想考虑使用值转换器代替(见下文)。

<DataTemplate x:Key="DataTemplate_Level2">
    <Grid 
        SnapsToDevicePixels="True" 
        x:Name="Background">
        <Label Content="{Binding}" />
    </Grid>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding}" Value="1">
            <Setter TargetName="Background" Property="Background" Value="Black" />
        </DataTrigger>
        <DataTrigger Binding="{Binding}" Value="2">
            <Setter TargetName="Background" Property="Background" Value="Khaki" />
        </DataTrigger>
        <DataTrigger Binding="{Binding}" Value="3">
            <Setter TargetName="Background" Property="Background" Value="YellowGreen" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

以下是值转换器版本:

<Window.Resources>
    <local:ColorConverter x:Key="ColorConverter" />

    <DataTemplate x:Key="DataTemplate_Level2">
        <Grid 
            SnapsToDevicePixels="True" 
            Background="{Binding Converter={StaticResource ColorConverter}}">
            <Label Content="{Binding}" />
        </Grid>
    </DataTemplate>
</Window.Resources>

C#

public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Color clr = Colors.SteelBlue;

        var s = value as String;

        //  Add code here to pick a color or generate RGB values for one
        switch (s) {
            case "1":
                clr = Colors.Black;
                break;
        }

        return new SolidColorBrush(clr); 
    }

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

@user2955610 您是指向列表中添加项目还是更改项目属性?对于添加项目,请使用ObservableCollection而不是List。对于项目上的属性,您的项目类必须实现INotifyPropertyChanged并在属性更改时引发PropertyChanged - 就像此其他答案中的ListItem类一样。 - 15ee8f99-57ff-4f92-890c-b56153

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接