【发布时间】:2010-08-14 12:39:50
【问题描述】:
我在 WPF 应用程序中有一个 DataGrid 控件。我希望能够在运行时从组合框中选择一个值,单击一个按钮并突出显示 DataGrid 中满足此条件的所有行的背景颜色。这在 Windows 窗体中的代码中很容易做到,但我无法在 WPF 中弄清楚。
感谢您的任何帮助。 谢谢
【问题讨论】:
我在 WPF 应用程序中有一个 DataGrid 控件。我希望能够在运行时从组合框中选择一个值,单击一个按钮并突出显示 DataGrid 中满足此条件的所有行的背景颜色。这在 Windows 窗体中的代码中很容易做到,但我无法在 WPF 中弄清楚。
感谢您的任何帮助。 谢谢
【问题讨论】:
您好,我创建了一个示例,它通过使用触发器和 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;
}
}
}
【讨论】: