C# 在ListView的CellTemplate中创建触发器?(通常与模板混淆)
当我深入研究WPF时,我开始有点困惑,我觉得这个例子将有助于更好地理解事物。我的要求是:我有一个ListView,它使用一个绑定到一组普通.NET对象,我想做两件事: 1) 如果值是某个值,则在ListView中突出显示行的单元格-我想我可以使用GridViewColumn.CellTemplate来实现此目的,并使用DataTrigger创建DataTemplate,然而,我在这里感到困惑-DataTemplate的数据类型应该是ListViewItem还是应该是底层对象本身的类型 这是我在WPF中的一个普遍困惑点。不知道何时将其键入基础集合对象(我在示例中看到过)与列表项类型本身。这是我的第一次尝试:C# 在ListView的CellTemplate中创建触发器?(通常与模板混淆),c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,当我深入研究WPF时,我开始有点困惑,我觉得这个例子将有助于更好地理解事物。我的要求是:我有一个ListView,它使用一个绑定到一组普通.NET对象,我想做两件事: 1) 如果值是某个值,则在ListView中突出显示行的单元格-我想我可以使用GridViewColumn.CellTemplate来实现此目的,并使用DataTrigger创建DataTemplate,然而,我在这里感到困惑-DataTemplate的数据类型应该是ListViewItem还是应该是底层对象本身的类型 这是我在W
<GridViewColumn Header="Position">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="{x:Type ListViewItem}">
<TextBlock Text="{Binding Path=PositionCode}"></TextBlock>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding PositionCode}" Value="QB">
<Setter Property="Foreground" Value="Blue" />
</DataTrigger>
<DataTrigger Binding="{Binding PositionCode}" Value="RB">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding PositionCode}" Value="WR">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
2) 类似于1)我希望在另一个条件上有一个类似的规则我希望高亮显示整行,而不仅仅是基于类似DataTrigger属性的单元格,但同时我希望单元格高亮显示优先于行高亮显示
我该怎么做?我需要覆盖哪个模板才能做到这一点?我猜是ListView.ItemTemplate,但数据类型是什么?试试这个:
<GridViewColumn Header="Position">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="{x:Type ListViewItem}">
<TextBlock Name="TextBlockName" Text="{Binding Path=PositionCode}"></TextBlock>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding PositionCode}" Value="QB">
<Setter TargetName="TextBlockName" Property="Foreground" Value="Blue" />
</DataTrigger>
<DataTrigger Binding="{Binding PositionCode}" Value="RB">
<Setter TargetName="TextBlockName" Property="Foreground" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding PositionCode}" Value="WR">
<Setter TargetName="TextBlockName" Property="Foreground" Value="Red" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
我认为dvvrd的回答解决了您的第一个问题。对于其他部分(构建行样式),可以使用ItemContainerStyleSelector 然后,不同的样式以及选择器引用进入App.xaml:
<Application.Resources>
<res:RowStyleSelector x:Key="Selector" />
<Style x:Key="Selected" TargetType="ListViewItem">
<Setter Property="Background" Value="DarkGray" />
</Style>
<Style x:Key="Normal" TargetType="ListViewItem">
<Setter Property="Background" Value="LightBlue" />
</Style>
</Application.Resources>
这种方法可以根据模型中的条件(我的示例中的Item类)有效地设置背景色,列高亮显示仍然有效。好的,谢谢。我还使用一个值转换器解决了这个问题,我想有条件地绑定这些属性,这也很有效-谢谢!我认为对于我来说,更广泛的理解问题是,绑定列表中的每个项都由一个内容控件(例如ListBoxItem、ComboBoxItem等)包装,并且您为列表的ItemTemplate属性指定的任何模板都将用作ContentTemplate(不是ControlTemplate-这总是让我感到困惑,因为单词看起来是一样的)列表中的每个项目本身
<ListView ItemContainerStyleSelector="{StaticResource Selector}" ...
public class RowStyleSelector : StyleSelector
{
public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container)
{
var i = (item as Item);
if (i.I == 0) return (Style)App.Current.Resources["Selected"];
else return (Style)App.Current.Resources["Normal"];
}
}
<Application.Resources>
<res:RowStyleSelector x:Key="Selector" />
<Style x:Key="Selected" TargetType="ListViewItem">
<Setter Property="Background" Value="DarkGray" />
</Style>
<Style x:Key="Normal" TargetType="ListViewItem">
<Setter Property="Background" Value="LightBlue" />
</Style>
</Application.Resources>