【问题标题】: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