2010-08-14 3 views
1

У меня есть элемент управления DataGrid в приложении WPF. Я хочу иметь возможность во время выполнения, выбрать значение из поля со списком, нажать кнопку и выделить цвет фона всех строк, соответствующих этому условию в DataGrid. Это было довольно легко сделать в Windows Forms в коде позади, но я не могу понять это в WPF.WPF DataGrid Dynamic Styling

Любая помощь с благодарностью получена. Спасибо

ответ

2

Здравствуйте, я создал образец, который решает это с помощью триггеров и valueconverter. В принципе, у меня есть триггер на ячейке сетки, которая привязана к выделенному элементу combo-box. Когда вы меняете выбор, срабатывает триггер, и ячейка использует valueconverter, чтобы узнать, совпадает ли выбранный элемент с значением ячейки сетки.

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> 

MainWindow код позади файла

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

    } 
} 

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; 
     } 
    } 
}