2010-08-14 57 views
1

我在WPF應用程序中有一個DataGrid控件。我希望能夠在運行時從組合框中選擇一個值,單擊一個按鈕並突出顯示DataGrid中滿足此條件的所有行的背景顏色。在後臺代碼中,這在Windows窗體中很容易實現,但我無法在WPF中找到它。WPF DataGrid Dynamic Styling

任何幫助感激地收到。 謝謝

回答

2

你好,我創建了一個樣本,通過使用觸發器和valueconverter解決這個問題。 基本上,我在gridcell上有一個觸發器,它綁定到組合框的selecteditem。當您更改選擇時,觸發器會觸發,並且單元格使用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> 

主窗口代碼

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

視圖模型

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