【问题标题】:WPF Set Label Background according to its Value using DataBindingWPF使用DataBinding根据其值设置标签背景
【发布时间】:2016-04-24 12:09:14
【问题描述】:

我目前正在制作一个网格,在每个单元格中都有一个标签,标签中的内容来自使用 DataBinding 的列表。 我正在尝试根据标签中的值更改每个单元格的颜色。例如,如果 value = 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>

我尝试了使用触发器的不同方法,但似乎没有任何效果。

任何帮助将不胜感激。

谢谢

【问题讨论】:

标签: c# wpf xaml data-binding


【解决方案1】:

就这么简单,但是您将复制和粘贴很多 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 class in this other answer
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多