C# WPF数据网格动态样式

C# WPF数据网格动态样式,c#,wpf,C#,Wpf,我在WPF应用程序中有一个DataGrid控件。我希望能够在运行时,从组合框中选择一个值,单击一个按钮并高亮显示DataGrid中满足此条件的所有行的背景色。这在Windows窗体中的代码隐藏中非常容易做到,但在WPF中我无法理解 感谢您的帮助。 谢谢您好,我创建了一个示例,通过使用触发器和valueconverter解决了这个问题。 基本上,我在gridcell上有一个触发器,它绑定到组合框的selecteditem。更改选择时,触发器触发,单元格使用valueconverter查看selec

我在WPF应用程序中有一个DataGrid控件。我希望能够在运行时,从组合框中选择一个值,单击一个按钮并高亮显示DataGrid中满足此条件的所有行的背景色。这在Windows窗体中的代码隐藏中非常容易做到,但在WPF中我无法理解

感谢您的帮助。
谢谢

您好,我创建了一个示例,通过使用触发器和valueconverter解决了这个问题。 基本上,我在gridcell上有一个触发器,它绑定到组合框的selecteditem。更改选择时,触发器触发,单元格使用valueconverter查看selecteditem是否与网格单元格的值相同

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>
视图模型

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;
        }
    }
}
使用System.Collections.ObjectModel;
使用系统组件模型;
命名空间ComboxFilter
{
公共类视图模型:INotifyPropertyChanged
{
公共视图模型()
{
名称=新的ObservableCollection
{
新人{Name=“Andy”},
新人{Name=“hkon”},
新人{Name=“dandy”},
新人{Name=“Andy”}
};
}
私人(u selected Person);;
公众人士
{
获取{return\u selectedPerson;}
设置{u selectedPerson=value;NotifyPropertyChanged(“selectedPerson”);}
}
公共ObservableCollection名称{get;set;}
公共事件属性更改事件处理程序属性更改;
public void NotifyPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
}
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;
        }
    }
}