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

WPF DataGrid 如何动态设置单行高度

WPF DataGrid 样式-Silverlight DataGrid?

WPF自定义样式篇-DataGrid

C# wpf datagrid 动态加载数据后改变单元格颜色bug

WPF DataGrid交替行样式