DataGrid异步验证

时间:2012-12-10 16:43:44

标签: c# wpf wpf-controls wpfdatagrid

我想制作包含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。

1 个答案:

答案 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吗?