以下是我的CollectionView:
<CollectionView
Margin="5,5,5,15"
ItemSizingStrategy="MeasureAllItems"
ItemsSource="{Binding Languages}"
SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}"
SelectionChangedCommand="{Binding LanguageChangedCommand}"
SelectionMode="Single">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="language:CultureInfo">
<ContentView Padding="5" >
<Grid ColumnDefinitions="*,3*">
<Grid.RowDefinitions>
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Image Source="{Binding TwoLetterISOLanguageName, StringFormat='flag_{0}.png'}" Grid.Column="0" HorizontalOptions="Start" />
<Label Text="{Binding DisplayName}" Grid.Column="1" HorizontalOptions="Start" VerticalOptions="Center" />
</Grid>
</ContentView>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
字符串
这是我的风格:
<Style TargetType="ContentView">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Transparent" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Selected">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="{StaticResource LaticreteColor}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
型
这里我设置了所选项目的背景颜色,但是我还需要设置所选项目的文本颜色,并且TextColor属性不存在:
无法解析类型“ContentView“上的属性“TextColor”(缺少属性或缺少访问器)。
如何才能做到这一点?
2条答案
按热度按时间yizd12fk1#
要实现该效果,您可以使用
VisualStateManager.VisualStateGroups
使其工作。请尝试为Label添加x:Name
,然后使用为Label设置TextColor
。请参阅在多个元素上设置状态。请参考下面的示例代码:
输出:
的数据
gcxthw6b2#
解决方案是将
VisualStateGroup
直接放置在您需要的DataTemplate
区域,因此,您可以将BackgroundColor
直接放置在ContentView
上,但也可以将TextColor
直接放置在Label
上。然而,我发现
CollectionView
在启动时没有正确显示VisualGroup的一个怪癖/bug。只有在你与CollectionView
交互后,你才能看到结果,因此,SelectedLanguages
中的任何初始值都不会显示给用户。解决此问题需要两种变通方法:
1.在应用程序启动时添加约500 ms的延迟,以延迟设置
SelectedLanguages
1.将
VisualStateGroup
替换为Binding
(或MultiBinding
)。在这里,我使用了一个简单的
CompareToObjectConverter
。你会看到这已经被硬编码为只识别字符串,但是,你可以推广到其他类型:字符串
然后,在XAML中,您可以在
Bindings
中引用此转换器:型