WPF DataGrid 动态样式
Posted
技术标签:
【中文标题】WPF DataGrid 动态样式【英文标题】:WPF DataGrid Dynamic Styling 【发布时间】:2010-08-14 12:39:50 【问题描述】:我在 WPF 应用程序中有一个 DataGrid 控件。我希望能够在运行时从组合框中选择一个值,单击一个按钮并突出显示 DataGrid 中满足此条件的所有行的背景颜色。这在 Windows 窗体中的代码中很容易做到,但我无法在 WPF 中弄清楚。
感谢您的任何帮助。 谢谢
【问题讨论】:
【参考方案1】:您好,我创建了一个示例,它通过使用触发器和 valueconverter 来解决这个问题。 基本上,我在网格单元上有一个触发器,它绑定到组合框的选定项。当您更改选择时,触发器会触发,并且单元格使用 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();
名称值转换器
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;
【讨论】:
以上是关于WPF DataGrid 动态样式的主要内容,如果未能解决你的问题,请参考以下文章
WPF DataGrid 样式-Silverlight DataGrid?