【发布时间】:2013-12-18 14:17:46
【问题描述】:
我有一个数据网格,它在绑定到数据表后输出 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 很陌生。我会尽力而为。
【问题讨论】:
-
很难不了解周围的环境。例如,这个搜索是如何完成的。我会在视图模型中触发对该数据网格的搜索,它只是在每个 ViewModel 上设置一个值(例如 IsHighlighted),并且在 xaml 中有一个简单的触发器。但这实际上取决于您的其余代码。
-
@Ryan Murphy - 您可以使用
IMultiValueConverter实现这一目标。我已经添加了一个答案。看看有没有帮助..!! -
由于这是 WPF,我实际上会尝试向填充有 @987654326 的数据行对象添加一个
IsGreen属性(或根据您的业务逻辑命名的类似名称) @/false,然后让您的 UI 反映这一点。