我在ListView上使用DataTemplate for SelectedItem作为:
<ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem">
<WrapPanel (...) BackGround="Silver">
</WrapPanel>
(...)
<Style TargetType="ListViewItem">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true" />
<Condition Property="Selector.IsSelectionActive" Value="true" />
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource SelectedTemplate}" />
</MultiTrigger>
</Style.Triggers>
</Style>
</ControlTemplate>
此外,ItemsSource绑定到IObservableCollection。但是我在myListView中选择项目时遇到了一些问题。我想要达到的是,默认项目模板具有白色背景。选定的背景是银。当我点击项目时,背景会发生变化。但是当我从代码中执行此操作时,listview已选择项目(选中,选中index = 0,selectetitem!= null),但项目从非选定项目获取样式。所以基本上我想用selectedTemplate选择项目。 我已经尝试了myListView.SelectedIndex,myLisview.SelectedItem,但是没有真正有用..有什么想法吗?
谢谢!
答案 0 :(得分:5)
如果我理解正确,你可以使用它,这样当您选择列表中的项目时,会显示所选模板银色背景,但是当您使用代码设置所选项目时它不会?
我创建了一个有效的简单示例,我必须做的更改是将listite上的selecteditem属性的绑定设置为双向..
<ListView SelectedItem="{Binding MySelectedItem, Mode=TwoWay}">
我的例子使用Caliburn Micro,但这并不重要。
继承我的示例代码,证明它正常工作......
查看型号:
public class ShellViewModel : Screen, IShell
{
private ObservableCollection<Person> people = new ObservableCollection<Person>();
public ObservableCollection<Person> People
{
get
{
return this.people;
}
set
{
this.people = value;
this.NotifyOfPropertyChange(() => this.People);
}
}
private Person selectedPerson;
public Person SelectedPerson
{
get
{
return this.selectedPerson;
}
set
{
this.selectedPerson = value;
this.NotifyOfPropertyChange(() => this.SelectedPerson);
}
}
public ShellViewModel()
{
var russell = new Person { Name = "Russell" };
this.People.Add(new Person { Name = "Benjamin" });
this.People.Add(new Person { Name = "Steve" });
this.People.Add(russell);
this.SelectedPerson = russell;
}
查看:强>
<Window x:Class="WpfApplication5.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<Style x:Key="TextStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType={x:Type ListBoxItem}},
Path=IsSelected}"
Value="True">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="MyItemTemplate">
<TextBlock Text="{Binding Name}" Style="{StaticResource TextStyle}"></TextBlock>
</DataTemplate>
</Window.Resources>
<Grid Background="White">
<ListView ItemsSource="{Binding People}" x:Name="People" ItemTemplate="{StaticResource MyItemTemplate}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
</ListView>
</Grid>
更改视图模型上的SelectedPerson属性也会显示在视图中。
希望这有帮助!
答案 1 :(得分:0)
您是否尝试过以自己的风格设置?
<Style>
<Setter Property="OverridesDefaultStyle" Value="true"/>
</Style
然后设置没有触发器的模板,所以完整代码就像这样
<Style TargetType="{x:Type listViewItem}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template" Value="{StaticResource SelectedTemplate}" />
</Style>
我之所以加入此样式,是因为如果您在ControlTemplate中使用它并将目标类型更改为{x:Type ListViewItem}
而不是targetType="ListViewItem"
,它将自动将此样式指定给所考虑的控件。
也许是因为我的回答是不完整的,人们投下我的答案,我甚至没有尊严来解释,哦,好吧:
这是扩展答案:
除了上面的代码,你应该在IsSelected
类中添加属性Person
,它应该实现INotifyPropertyChanged并在你的xaml中:
“&GT;
现在在您的视图模型中 你应该在构造函数中有这样的东西
//lsvProducts is our ListView
view = (CollectionView) CollectionViewSource.GetDefaultView(lsvPeople.ItemsSource);
//in the creation parameter you should put field that you want to group by :-)
PropertyGroupDescription grouping = new PropertyGroupDescription("<FieldToGroupBy>");
view.GroupDescriptions.Add(grouping);
回到xaml
<Style x:Key="GroupedView" TargetType="{x:Type GroupItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="True">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="False">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />
<TextBlock Text="{Binding ItemCount}" FontSize="16" Foreground="DimGray" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" />
<TextBlock Text=" item(s)" FontSize="16" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
和
<!--This goes in the same style as the prevoius sample code -->
<DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="False">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
注意强>
绑定到元素时,您可以在VM中定义一个bool IsGrouping
并将其绑定到该元素。
祝你好运: - )