2011-03-06 5 views
1

J'ai une propriété 'current' externe (int) qui représente l'index actuel d'une collection. J'ai un listview qui affiche cette collection. Je veux pouvoir styliser le 'nième' item de la collection en fonction de la valeur de 'current', c'est-à-dire si current est 3, mettre en surbrillance le 4ème item de la collection (index = 3), etc. ? Une alternative consisterait à lier lorsque le texte de l'élément est égal à une autre propriété externe.style nième article dans listview?

Répondre

0

Pour personnaliser le style d'un ListView, vous pouvez créer un DataTrigger qui se lie à une propriété du DataContext de View pour modifier le style actuel. Dans cet exemple, le code modifie l'arrière-plan.

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
    <Setter Property="Background" Value="Aqua"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=DataContext.StyleType, RelativeSource={RelativeSource Self}}" Value="1"> 
      <Setter Property="Background" Value="Chartreuse"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.ItemContainerStyle> 

J'ai ajouté la plupart du code ici afin que vous puissiez obtenir le tableau complet que possible de ce qui se passe, mais je sautais les classes de base MVVM commune.

Comment ça marche:

  1. ListView ItemsSource se fixe aux clients
  2. ListView SelectedItem se fixe au client
  3. ListView.ItemContainerStyle a une DataTrigger qui se lie à DataContext.StyleType
  4. DataContext est une liste de Objets client avec une propriété StyleType définie par l'utilisateur qui est initialisée dans le code-behind
  5. Une commande de bouton efface la valeur de StyleType
  6. cliquant sur une ligne change le style de la ligne suivante
  7. implémente Client INotifyPropertyChanged, qui se déclenche lorsque StyleType change
  8. DataTrigger modifie l'arrière-plan de chaque ListViewItem

Voici le XAML, regardez DataTrigger:

<Window x:Class="ListViewScrollPosition.Views.ScrollBarwindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Style on Model" Height="300" Width="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <ListView 
      Grid.Row="0" 
      SelectedItem="{Binding Customer}" 
      ItemsSource="{Binding Customers}" x:Name="myListView"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
        <Setter Property="Background" Value="Aqua"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=DataContext.StyleType, RelativeSource={RelativeSource Self}}" Value="1"> 
          <Setter Property="Background" Value="Pink"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="First Name" 
            DisplayMemberBinding="{Binding FirstName}" /> 
        <GridViewColumn Header="Last Name" 
            DisplayMemberBinding="{Binding LastName}" /> 
        <GridViewColumn Header="Style Type" 
            DisplayMemberBinding="{Binding StyleType}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <Button Grid.Row="1" Content="Change Style" Command="{Binding Path=AlterStyle}"/> 
    </Grid> 
</Window> 

Voici ViewModel la vue utilise pour obtenir des clients et de modifier la valeur de StyleType:

using System.Collections.Generic; 
using System.Windows.Input; 
using ListViewScrollPosition.Commands; 
using ListViewScrollPosition.Models; 

namespace ListViewScrollPosition.ViewModels 
{ 
public class MainViewModel : ViewModelBase 
{ 
    private DelegateCommand _alterStyleCommand; 

    public MainViewModel() 
    { 
    } 

    public ICommand AlterStyle 
    { 
    get 
    { 
     if (_alterStyleCommand == null) 
     { 
      _alterStyleCommand = new DelegateCommand(AlterStyleCommand); 
     } 
     return _alterStyleCommand; 
    } 
    } 

    private void AlterStyleCommand() 
    { 
    foreach (var customer in Customers) 
    { 
     customer.StyleType = 0; 
    } 
    } 

    private void ApplyStyleToNextRow(Customer currentCustomer) 
    { 
    bool setNext = false; 
    foreach (var customer in Customers) 
    { 
     if (setNext) 
     { 
     customer.StyleType = 1; 
     setNext = false; 
     } 
     else 
     { 
     customer.StyleType = 0; 
     } 

     if (currentCustomer == customer) 
     { 
     setNext = true; 
     } 
    } 
    } 

    private List<Customer> _customers = Customer.GetSampleCustomerList(); 
    public List<Customer> Customers 
    { 
    get 
    { 
     return _customers; 
    } 
    } 

    private Customer _customer = null; 
    public Customer Customer 
    { 
    get 
    { 
     return _customer; 
    } 
    set 
    { 
     _customer = value; 
     ApplyStyleToNextRow(_customer); 
     OnPropertyChanged("Customer"); 
    } 
    } 
} 
} 

Voici le modèle, ViewModelBase implémente INotifyPropertyChanged, les feux de StyleType OnPropertyChanged lorsque changé, ce qui met à jour chaque ListViewItem:

using System; 
using System.Collections.Generic; 

namespace ListViewScrollPosition.Models 
{ 
    public class Customer : ViewModels.ViewModelBase 
    { 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 

    private int _style; 
    public int StyleType 
    { 
     get { return _style;} 
     set 
     { 
     _style = value; 
     OnPropertyChanged("StyleType"); 
     } 
    } 

    public Customer(String firstName, String lastName, int styleType) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
     this.StyleType = styleType; 
    } 

    public static List<Customer> GetSampleCustomerList() 
    { 
    return new List<Customer>(new Customer[4] { 
      new Customer("A.", "Zero", 0), 
      new Customer("B.", "One", 1), 
      new Customer("C.", "Two", 2), 
      new Customer("D.", "Three", 1) 
     }); 
    } 
    } 
} 

Voici le code-behind où je configurer le DataContext:

using System.Windows; 
namespace ListViewScrollPosition.Views 
{ 
    public partial class ScrollBarwindow : Window 
    { 
    public ScrollBarwindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModels.MainViewModel(); 
    } 
    } 
} 
+0

Merci, mais je ne vois pas de réponse à ma question dans ce code. Comment le 3ème élément est-il surligné lorsque Count == 2, et le 4ème élément est surligné quand Count == 3, etc? Je préfère également ne pas modifier mon modèle spécifiquement à des fins de style. – DaveO

+0

Le but de ma réponse était de montrer que vous pouvez utiliser les données liées dans la grille pour contrôler l'affichage. La façon dont vous appliquez cette information peut être potentiellement difficile étant donné que l'utilisateur peut trier les données dans la vue par exemple. J'ai modifié ma réponse pour changer le style de la rangée suivante en fonction de la ligne actuellement sélectionnée, mais j'ajouterai que je n'ai pas résolu le problème du tri. Si vous trouvez un moyen meilleur, veuillez poster votre solution et je voterai pour cela. – Zamboni