【问题标题】:WPF DataGrid Dynamic StylingWPF DataGrid 动态样式
【发布时间】:2010-08-14 12:39:50
【问题描述】:

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

感谢您的任何帮助。 谢谢

【问题讨论】:

    标签: c# 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2010-12-16
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多