我有一个数据网格,绑定到数据表后输出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#中设置的范围内,则如何更改它,然后将其突出显示为绿色。
绑定到数据表:
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。Based on the value returned by converter, change background color
。
将三个参数传递给转换器:
转换器
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,
object parameter, 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"
更新(如果要在数字数组中查找项目)
假设您的数字数组属性存在于代码后面或视图模型类中。
首先,您需要set ItemsSource of DataGrid to DataTable
代替DataContext。
第二,set DataContext of DataGrid to this from code behind or an instance of viewModel class
。
另外,要刷新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, Type targetType,
object parameter, 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, Type[] targetTypes,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
现在,将根据中的初始数字突出显示项目RangeNumbers
。但是,假设您事后更新数组,则需要引发属性更改事件,以使GUI刷新如下:
RangeNumbers = new int[] { 23, 45, 47, 69 };
OnPropertyChanged("RangeNumbers");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句