我想制作包含DataGrid控件的WPF窗口,并在C#WPF DataGrid中启用以下场景:数据在DataGrid中加载,应用程序在后台验证数据(并行异步操作),当确定行有效时,其bacground颜色变绿,否则变红。编写此行为的最简洁方法是什么? DataGrid和WPF中是否有内置功能来进行这种验证?
编辑: 目前我已经通过使用RowStyle来执行此操作,但这会使应用程序无响应,因为验证每行需要一些时间,所以我想使这个异步并行。
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{Binding BgColor}">
</Setter>
</Style>
</DataGrid.RowStyle>
EDIT2: 这是进步:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=BgColor}" Value="DarkRed">
<Setter Property="Background" Value="DarkRed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
背后的代码如下:
Func<List<bool>> func = () => data.AsParallel().Select(x => File.Exists(x.FullPath)).ToList();
List<bool> res = null;
IAsyncResult ar = func.BeginInvoke(new AsyncCallback(x=>
{
res = ((Func<List<bool>>)((AsyncResult)x).AsyncDelegate).EndInvoke(x);
for (int i = 0; i < res.Count; ++i)
if (!res[i])
data[i].BgColor = Brushes.DarkRed;
}), null);
剩下的问题是只有在重绘行(移出视图而不是再次进入视图)时才会刷新行背景颜色。有什么简洁明了的方法吗?
EDIT3: 最后一切都完全按照要求工作,EDIT2中唯一缺少的就是在数据源类中实现INotifyPropertyChanged。
答案 0 :(得分:2)
最好的方法是使用DataTrigger
样式的DataGridItems
,并在ViewModel中提供一个绑定到bool?
的属性(DataTrigger
) 。在DataTrigger
中,您可以声明所有三种状态Null, True, False
有关DataTrigger
的其他信息,请查看here。
修改
嗯,有机会将突出显示功能放在DataTemplate
中吗?我实现了对实体选择状态的突出显示。它按预期工作。
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
Value="true">
<!-- Expand -->
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard Storyboard.TargetName="CommandPanel">
<DoubleAnimation Duration="0:0:0.200" Storyboard.TargetProperty="Opacity" To="1" />
<DoubleAnimation Duration="0:0:0.150" Storyboard.TargetProperty="Height"
To="{StaticResource TargetHeightCommandPanel}" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<!-- Collapse -->
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard Storyboard.TargetName="CommandPanel">
<DoubleAnimation Duration="0:0:0.100" Storyboard.TargetProperty="Opacity" To="0" />
<DoubleAnimation Duration="0:0:0.150" Storyboard.TargetProperty="Height" To="0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</DataTemplate.Triggers>
是的,你听说过MVVM吗?