我正在使用C#/XAML构建Windows Store应用程序。
我有一个简单的ListView绑定到ItemsSource。有一个DataTemplate,它定义了每个项目的结构,其中有一个ContentControl和一个TextBlock。
我希望在选中项目时更改TextBlock的前景颜色。有谁知道我该怎么做吗?
<ListView Grid.Column="1"
ItemsSource="{Binding Categories}"
ItemContainerStyle="{StaticResource CategoryListViewItemStyle}"
Background="{StaticResource DeepRedBrush}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ContentControl Content="{Binding Id, Converter={StaticResource Cat2Icon}}" HorizontalAlignment="Left" VerticalAlignment="Center" Width="110" Foreground="#FF29BCD6"/>
<TextBlock x:Name="catName" HorizontalAlignment="Left" Margin="0" TextWrapping="Wrap" Text="{Binding Name}" Grid.Column="1" VerticalAlignment="Center" FontSize="18.667"
Foreground="White"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
目前它被设置为“白色”,所以我所需要的只是一些绑定表达式,它将根据列表视图中项目的选定状态来更改Foreground属性。
3条答案
按热度按时间qgelzfjb1#
这就是你所要求的。
使用此XAML
下面的代码:
它将为您更新数据模板。
我想简单说一下:通过ViewModel更新列表的内容是最简单和最轻量级的方法。在本例中,我更新了绑定到椭圆的颜色。但是,如果这是一组复杂的更改,我可能只设置一个样式。另一个选项是在模板中隐藏和显示整个控件集。但是,您不能更改数据模板,因为在重新绘制网格之前不会重新呈现数据模板,而这不是您想要做的。
就像更改椭圆颜色一样,您可以更改TextBlock前景,就像您在问题中要求的那样。无论哪种方式,这都能以最优雅的方式让你得到你想要的。
祝你好运!
ftf50wuq2#
您可以简单地处理
ListView
上的SelectionChanged
事件,并通过更改绑定到Foreground
的SelectedItem
上的视图模型值来更改先前选定项和新选定项的Foreground
。您还可以使用
ListView.ItemContainerGenerator.ContainerFromItem(ListView.SelectedItem)
+VisualTreeHelper
(如Jerry Nixon's blog post中所示)并直接更改前台来查找TextBlock
,但如果您的ListView
是虚拟化的,则该技术会出现问题(这是默认的),因为如果你从所选项目滚动离开并返回-具有已更改Foreground
的项目视图可能会被回收并用于集合中的另一个项目。另一种选择是将
Foreground
绑定到父ListViewItem
的IsSelected
属性,您也可以通过许多方式来执行此操作。例如,您可以将整个DataTemplate
放在UserControl
中,并将Foreground
绑定到该控件的Parent
。问题是我认为Parent
不是一个依赖属性,并且我在FrameworkElement
(定义Parent
属性的UserControl
的基类)上没有看到ParentChanged
事件,所以可能很坚韧走这条路。绑定这些的另一种方法是定义一个附加的依赖项属性或行为来为您设置绑定,但这很复杂(尽管我已经创建了一个您可以在这里使用的属性)。最后,您可以修改
ListView.ItemContainerStyle
并更改SelectedBackground
值。如果这样做-这将是一个理想的解决方案。cwdobuhd3#
它对我起作用