2010-08-14 8 views
1

J'ai un contrôle DataGrid dans une application WPF. Je veux pouvoir à l'exécution, sélectionnez une valeur d'une zone de liste déroulante, cliquez sur un bouton et mettez en surbrillance la couleur d'arrière-plan de toutes les lignes qui répondent à cette condition dans le DataGrid. C'était assez facile à faire dans Windows Forms dans le code derrière, mais je ne peux pas le comprendre dans WPF.WPF DataGrid Dynamic Styling

Toute aide reçue avec gratitude. Merci

Répondre

2

Bonjour J'ai créé un échantillon qui résout cela en utilisant des triggers et un convertisseur de valeur. Fondamentalement, j'ai un déclencheur sur la gridcell, qui est lié à l'élément sélectionné de la combo-box. Lorsque vous modifiez la sélection, le déclencheur se déclenche et la cellule utilise le convertisseur de valeurs pour voir si l'élément sélectionné est identique à la valeur de la cellule de la grille.

MainWindow.xaml

<Window x:Class="ComboBoxFilter.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ComboBoxFilter="clr-namespace:ComboBoxFilter" Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ComboBoxFilter:NameValueConverter x:Key="NameValueConverter" /> 
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding Names}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" x:Name="TheComboBox" /> 
     <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Names}" x:Name="DataGrid" > 
      <DataGrid.CellStyle> 
       <Style TargetType="{x:Type DataGridCell}"> 
        <Style.Triggers> 
         <DataTrigger Value="True" > 
          <DataTrigger.Binding> 
           <MultiBinding Converter="{StaticResource NameValueConverter}"> 
            <Binding Path="SelectedItem.Name" ElementName="TheComboBox" Mode="TwoWay" /> 
            <Binding Path="Name" />           
           </MultiBinding> 
          </DataTrigger.Binding> 
          <Setter Property="Background" Value="Green" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.CellStyle> 
     </DataGrid> 
    </StackPanel> 
</Grid> 

code MainWindow derrière fichier

namespace ComboBoxFilter 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new ViewModel(); 
     } 

    } 
} 

de NameValueConverter

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Text; 
using System.Windows.Data; 

namespace ComboBoxFilter 
{ 
    public class NameValueConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      var string1 = values[0]; 
      var string2 = values[1]; 
      return string1 == string2; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

ViewModel

using System.Collections.ObjectModel; 
using System.ComponentModel; 

namespace ComboBoxFilter 
{ 
    public class ViewModel : INotifyPropertyChanged 
    { 
     public ViewModel() 
     { 
      Names = new ObservableCollection<Person> 
         { 
          new Person {Name = "Andy"}, 
          new Person {Name = "hkon"}, 
          new Person {Name = "dandy"}, 
          new Person {Name = "Andy"} 
         }; 
     } 

     private Person _selectedPerson; 
     public Person SelectedPerson 
     { 
      get { return _selectedPerson; } 
      set { _selectedPerson = value; NotifyPropertyChanged("SelectedPerson"); } 
     } 

     public ObservableCollection<Person> Names { get; set; } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
    public class Person 
    { 
     public string Name { get; set; } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 
}