代码之家  ›  专栏  ›  技术社区  ›  andyJ

WPF数据网格动态样式

  •  1
  • andyJ  · 技术社区  · 15 年前

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

    感谢您的帮助。 谢谢你

    1 回复  |  直到 15 年前
        1
  •  2
  •   hkon    15 年前

    你好,我创建了一个通过使用触发器和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>
    

    主窗口代码隐藏文件

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