使用Selected DataTemplate在ListView中选择对象

时间:2014-01-14 10:47:04

标签: c# wpf listview datatemplate selected

我在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,但是没有真正有用..有什么想法吗?

谢谢!

2 个答案:

答案 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并将其绑定到该元素。 祝你好运: - )