我尝试使用绑定到绑定项 (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 类有一个“TimeEntryType”枚举和一个“Type”属性:
public enum TimeEntryType
{
Unknown,
Standard,
Break
}
public TimeEntryType Type
{
get
{
if (_isBreak)
{
return TimeEntryType.Break;
}
return TimeEntryType.Standard;
}
}
这就是这个属性/枚举的转换器的样子:
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”,尽管看起来转换器正在被正确使用并将这个值作为前景色或背景色返回。