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" 用来绘画的东西。
我尝试使用绑定到绑定项 (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" 用来绘画的东西。