UWP 应用程序中的绑定和转换器未设置背景颜色

Background color not being set with binding and converter in UWP app

我尝试使用绑定到绑定项 (TimeEntry) 的 属性 在 UWP 应用程序中设置列表项的背景颜色(或出于测试目的设置 TextBlock 的文本前景色)。

这是绑定到 TimeEntries 集合的 ListView 的 Xaml(倒数第二行的相关 TextBlock):

...
    <Page.Resources>
        <local:TimeEntryTypeColorConverter x:Key="TimeEntryTypeColorConverter" />
    </Page.Resources>
...
<StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="1">
            <TextBlock Text="Xy:" />
            <ListView>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"></ColumnDefinition>
                                ....
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="Test" Grid.Row="0" Grid.Column="0" Foreground="{Binding Type, Converter={StaticResource TimeEntryTypeColorConverter}}" />
                            ...

TimeEntry class 有一个枚举 'TimeEntryType' 和一个 'Type' 属性:

public enum TimeEntryType
    {
        Unknown,
        Standard,
        Break
    }

public TimeEntryType Type
{
    get
    {
        if (_isBreak)
        {
            return TimeEntryType.Break;
        }
        return TimeEntryType.Standard;
    }
}

这就是这个 property/enum 的转换器的样子:

public class TimeEntryTypeColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;
        var timeEntryType = (TimeEntry.TimeEntryType)value;
        if (timeEntryType == TimeEntry.TimeEntryType.Break)
            return Colors.LightGray;

        return Colors.Transparent;
    }

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

我对 ListView 项集合的 TimeEntry 对象有其他有效的绑定。而且这个绑定似乎也有效,因为调试器告诉我正在使用转换器,它也会转换为 "LightGray",例如 'Break'。但是UI没有变化,直接更新其他绑定,所以绑定正常。

我不明白为什么 UI 没有更新到 'LightGray' 虽然看起来转换器被正确使用并且 returns 这个值作为前景或背景颜色.

documentation 所示; Foreground 期望 Brush 而不是 Color

您可以通过以下方式解决您的问题:

var color = // Select your color here //
var brush = new SolidColorBrush(color);

从本质上讲,颜色是不言自明的,但画笔是真正的 "material" 用来绘画的东西。