2011-01-28 104 views
0

我的ListView用的SelectionMode =伸出和样式的ListViewItem从而:样式列表视图Selector.SelectedItem

MainWindow.xaml:

<Window x:Class="ListViewSelection.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Aqua"/> 
      </Style.Resources> 
      <!--<Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="Aqua" /> 
       </Trigger> 
      </Style.Triggers>--> 
     </Style> 
    </Window.Resources> 
    <StackPanel> 
     <ListView Name="MyListView" ItemsSource="{Binding MyList}" SelectionChanged="SelectionChanged" SelectionMode="Extended" /> 
     <Label Name="MyLabel" /> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Collections.ObjectModel; 

namespace ListViewSelection 
{ 
    public partial class MainWindow : Window 
    { 

     public ObservableCollection<string> MyList { get; set; } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 
      MyList = new ObservableCollection<string>(); 
      MyList.Add("Jane"); 
      MyList.Add("Paul"); 
      MyList.Add("Sally"); 
      MyList.Add("Ian"); 
     } 

     private void SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      MyLabel.Content = (sender as ListBox).SelectedItem; 
     } 
    } 
} 

这为所有选定的项目设置颜色。但是我还需要选择Selector.SelectedItem,它是选择中的“活动”或第一项。这是标签显示的那个。

任何帮助?谢谢!

回答

0

你可以暴露你的ViewData类IsFirstInSelection属性(我想你有的话)。

然后,你可以把DataTrigger监测这样的变化:

 <Style.Triggers> 
      <DataTrigger Binding="{Binding IsFirstInSelection}"> 
       <Setter Property="Background" 
         Value="Blue"/> 
      </DataTrigger> 
     </Style.Triggers> 

另外,在你的情况我建议你避免改变HighlightBrushKey,但实现通过改变背景属性你的目标。你也可能使IsSelected属性中的ViewData类,所以它看起来是:

public class ViewData: ObservableObject 
{ 
    private bool _isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return this._isSelected; 
     } 
     set 
     { 
      if (this._isSelected != value) 
      { 
       this._isSelected = value; 
       this.OnPropertyChanged("IsSelected"); 
      } 
     } 
    } 

    private bool _isFirstInSelection; 
    public bool IsFirstInSelection 
    { 
     get 
     { 
      return this._isFirstInSelection; 
     } 
     set 
     { 
      if (this._isFirstInSelection != value) 
      { 
       this._isFirstInSelection = value; 
       this.OnPropertyChanged("IsFirstInSelection"); 
      } 
     } 
    } 
} 

而基于这两个属性的样式集背景:

 <Style x:Key="TreeItemStyle" 
       TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" 
        Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
      <Setter Property="IsFirstInSelection" 
        Value="{Binding Path=IsFirstInSelection}"/> 
      <Setter Property="Background" 
        Value="Green"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsSelected}" 
          Value="True"> 
        <Setter Property="Background" 
          Value="Red"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding IsFirstInSelection}"> 
        <Setter Property="Background" 
         Value="Blue"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
在模型或视图代码后面,你应该

当然监视IsSelected属性已更改通知并根据选定项目设置/重置IsFirstInSelection。

我希望你能理解我的想法。

------- -------- EDITED

起初我继续坚持,你应该养成正确的ViewData类:

public class ViewData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     var ev = this.PropertyChanged; 
     if (ev != null) 
     { 
      ev(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public ViewData(string name) 
    { 
     this._personName = name; 
    } 

    private string _personName; 
    public string PersonName 
    { 
     get 
     { 
      return this._personName; 
     } 
     set 
     { 
      if (this._personName != value) 
      { 
       this._personName = value; 
       this.OnPropertyChanged("PersonName"); 
      } 
     } 
    } 

    private bool _isFirstSelected; 
    public bool IsFirstSelected 
    { 
     get 
     { 
      return this._isFirstSelected; 
     } 
     set 
     { 
      if (this._isFirstSelected != value) 
      { 
       this._isFirstSelected = value; 
       this.OnPropertyChanged("IsFirstSelected"); 
      } 
     } 
    } 
} 

在处理的SelectionChanged事件你应该修改属性IsFirstSelected像这样:

public ObservableCollection<ViewData> MyList { get; set; } 
private void SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var lb = sender as ListBox; 
    if (lb != null) 
    { 
     MyLabel.Content = lb.SelectedItem; 
     foreach (var item in this.MyList) 
     { 
      if (item == lb.SelectedItem) 
      { 
       item.IsFirstSelected = true; 
      } 
      else 
      { 
       item.IsFirstSelected = false; 
      } 
     } 
    } 
} 

但是默认的ListViewItem模板不会对Background setters所以你应该覆盖其风格的模板:

<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListViewItem"> 
       <Grid Background="{TemplateBinding Background}"> 
        <ContentPresenter Content="{Binding PersonName}"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" 
           Value="True"> 
         <Setter Property="Background" 
           Value="Yellow"/> 
        </Trigger> 

        <DataTrigger Binding="{Binding IsFirstSelected}" 
            Value="True"> 
         <Setter Property="Background" 
           Value="Aqua" /> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

如果这种解决方案是不可接受的,请告诉我。我有一些想法,但没有足够的时间在代码中检查它们。

+0

我了解使用数据触发并绑定到基础项目的想法,但在我的案件的ItemsSource在我的ListView势必CollectionViewSource.View,所以不知道如何从那里得到这个项目,否则即使我能修改它添加这个IsFirstInSelection属性。 – DaveO 2011-01-28 09:22:53