我有一个datagrid,绑定到数据表后输出90行.行值为1-90递增.
我想要实现的目标:
如果在数组/范围/数字列表中找到该数字,则将其突出显示为绿色.
我设法让它基于1值突出显示单元格,但是如果在范围内找到它们,我想要突出显示几个单元格.
<DataGrid Name="grid" ItemsSource="{Binding}" Height="300" Width="900" AutoGenerateColumns="False" VerticalScrollBarVisibility="Disabled" HorizontalAlignment="Center" VerticalAlignment="Top" RowHeight="40"> <DataGrid.Resources> <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}"> <Style.Triggers> <Trigger Property="Text" Value="1"> <Setter Property="Background" Value="LightGreen" /> </Trigger> </Style.Triggers> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=Number}" ElementStyle="{StaticResource BackgroundColourStyle}" MinWidth="40"> </DataGridTextColumn> </DataGrid.Columns> <DataGrid.ItemsPanel> <ItemsPanelTemplate> <WrapPanel Orientation="Vertical" /> </ItemsPanelTemplate> </DataGrid.ItemsPanel> </DataGrid>
你可以看到我有一个值为1的触发器属性.这样可以正常工作,但是如上所述,如何更改此值,如果单元格位于后端c#中设置的范围内,则将其高亮显示为绿色.
绑定到datatable:
calledGrid.DataContext = calledNumbers.DefaultView;
数据表的实际制作:
DataSet dataSet = new DataSet("myDS"); this.bingoCalls(dataSet); DataTable numbersTable = new DataTable("Numbers"); numbersTable.Columns.Add("Number",typeof(Int32)); for (int i = 1; i < 91; i++) { numbersTable.Rows.Add(i); } dataSet.Tables.Add(numbersTable);
谢谢你的帮助.如果您需要更多信息,或者我一直在模糊或不清楚任何事情,请询问,我会尽我所能尽快回复.也请原谅我可能有的任何无知,我对wpf很新.我会尽我所能.
解决方法
您可以使用IMultiValueConverter实现该功能,如果Text位于范围内,则返回true,否则返回false.根据转换器返回的值,更改背景颜色.
将三个参数传递给转换器:
>实际文本值.
>最低价值.
>最大价值.
变流器
public class ItemExistInRangeConverter : IMultiValueConverter { public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture) { bool itemsExistInRange = false; if (values.Length == 3) { int outputValue = int.MinValue; if (Int32.TryParse(values[0].ToString(),out outputValue)) { int minValue = (int)values[1]; int maxValue = (int)values[2]; itemsExistInRange = minValue <= outputValue && outputValue <= maxValue; } } return itemsExistInRange; } public object[] ConvertBack(object value,Type[] targetTypes,CultureInfo culture) { throw new NotImplementedException(); } }
XAML
<DataGrid.Resources> <local:ItemExistInRangeConverter x:Key="ItemExistInRangeConverter"/> <sys:Int32 x:Key="MinimumValue">1</sys:Int32> <sys:Int32 x:Key="MaximumValue">50</sys:Int32> <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource ItemExistInRangeConverter}"> <Binding Path="Text" RelativeSource="{RelativeSource Self}"/> <Binding Source="{StaticResource MinimumValue}"/> <Binding Source="{StaticResource MaximumValue}"/> </MultiBinding> </DataTrigger.Binding> <Setter Property="Background" Value="LightGreen" /> </DataTrigger> </Style.Triggers> </Style> </DataGrid.Resources>
确保在根级别添加相应的命名空间:
xmlns:local="clr-namespace:NamespaceOfConverter" // Replace NamespaceOfConverter with namespace where converter resides. xmlns:sys="clr-namespace:System;assembly=mscorlib"
更新(如果想要在数组中查找项目)
首先,您需要将DataGrid的ItemsSource设置为DataTable而不是DataContext.
其次,将DataGrid的DataContext设置为后面的代码或viewmodel类的实例.
另外,要刷新GUI,您的类应该实现INotifyPropertyChanged接口.
现在,假设你有一个属性说:
public int[] RangeNumbers { get; set; }
默认情况下,它将包含您要突出显示的数字列表.
XAML将如下所示:
<DataGrid.Resources> <local:ItemExistInRangeConverter x:Key="ItemExistInRangeConverter"/> <Style x:Key="BackgroundColourStyle" TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource ItemExistInRangeConverter}"> <Binding Path="Text" RelativeSource="{RelativeSource Self}"/> <Binding Path="DataContext.RangeNumbers" RelativeSource="{RelativeSource FindAncestor,AncestorType=DataGrid}"/> </MultiBinding> </DataTrigger.Binding> <Setter Property="Background" Value="LightGreen" /> </DataTrigger> </Style.Triggers> </Style> </DataGrid.Resources>
转换器代码:
public class ItemExistInRangeConverter : IMultiValueConverter { public object Convert(object[] values,CultureInfo culture) { bool itemsExistInRange = false; if (values.Length == 2) { int outputValue = int.MinValue; int[] rangeNumbers = (int[])values[1]; if (rangeNumbers != null && Int32.TryParse(values[0].ToString(),out outputValue)) { itemsExistInRange = rangeNumbers.Contains(outputValue); } } return itemsExistInRange; } public object[] ConvertBack(object value,CultureInfo culture) { throw new NotImplementedException(); } }
现在,将根据RangeNumbers中的初始数字突出显示项目.但是假设您之后更新了数组,则需要引发属性更改事件,以便GUI刷新如下:
RangeNumbers = new int[] { 23,45,47,69 }; OnPropertyChanged("RangeNumbers");