c# - 如何在 WPF DataGrid 中突出显示一行并强制刷新行/单元格?

标签 c# .net wpf datagrid wpf-controls

这是我关于 SOF 的第一个问题,所以请对我温和一点:)

我有一个用 XAML 定义的简单 WPF DataGrid。应用程序将“用户”数据(名字、姓氏)从文本文件加载到网格中,从文本文件加载条目后,用户点击提交按钮,我想遍历列表中的项目并提交每个行到创建用户的 Web 服务,然后在网格中显示来自 Web 服务的回复。

为了让用户了解情况,我想以某种方式突出显示当前提交的行,并且我希望在收到响应后立即显示消息。如果消息是错误的,则以红色突出显示该行,如果成功,则以绿色突出显示。

看起来很简单......

我有一个简单的 GridDto 类,它表示要映射到每一行的数据。它实现了 INotifyPropertyChanged 接口(interface)。为了简单起见,我将其定义如下:

class GridDto : INotifyPropertyChanged
{
  public string FirstName { get; set; }
  public string LastName { get; set; }

  private string Reply;
  public string Reply
  {
      get
      {
        return this.message;
      }
      set
      {
          this.message = value;
          this.PropertyChanged(this, new PropertyChangedEventArgs("Reply"));
      }
   }

网格接受来自文本文件的名字和姓氏列表。

我填充此网格的方式是构建一个 ObservableCollection<GridDto> 的集合然后我做:

resultGrid.ItemsSource = ConvertTextDtoToGridDtos(result.Elements);

到目前为止一切顺利。现在我想将网格的每一行提交给创建用户的网络服务。 websrvice 需要的唯一参数是 FirstName 和 LastName。

由于我是 WPF 的新手,所以我不知道该怎么做。这是我到目前为止所做的:

for (int i = 0; i < resultGrid.Items.Count - 1; i++)
{
    var dto = (GridDto)this.resultGrid.Items[i];
    var color = Color.FromRgb(192, 192, 25);
    try{
       // Do webservice call using the dto data
    }
    catch(Exception ex){
      dto.Reply = ex.Message;
      color = Color.FromRgb(255, 0, 0);
    }

  DataGridRow row = (DataGridRow)resultGrid.ItemContainerGenerator.ContainerFromIndex(i);
  row.Background = new SolidColorBrush(color) { Opacity = 0.45 };
}

这有点管用,但不会突出显示当前正在处理的行。

我尝试在我的循环中添加以下内容

resultGrid.SelectedIndex = i;

或者...

resultGrid.SelectedItem = resultGrid.Items[i];
resultGrid.ScrollIntoView(resultGrid.Items[i]);

只有最后一行在循环结束时突出显示,此时一切似乎都已更新。

此代码的另一个问题是 Reply 列仅在最后刷新,在所有行都已提交后,因此没有实时通知用户。

我如何以巧妙的方式突出显示当前处理的行,最重要的是,我如何在每次回复后和处理下一行之前更新回复单元格。

感谢您的帮助,很抱歉我的问题很长。

编辑:如果有更好的方法一起完成这一切,我欢迎提出建议。

最佳答案

首先,您可以通过将此代码放入 DataGrid block 中的 XAML,将 bacgroundcolor 绑定(bind)到样式属性

        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="Background" Value="{Binding Path=Color}"/>
            </Style>
        </DataGrid.RowStyle>

如果你想实时刷新 UI,你必须使用 backgroud worker 来提交用户

            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += delegate(object s, DoWorkEventArgs we)
            {
                for (int i = 0; i < resultGrid.Items.Count - 1; i++)
                {
                    var dto = (GridDto)this.resultGrid.Items[i];
                    var color = Color.FromRgb(192, 192, 25);
                    try
                    {
                        // Do webservice call using the dto data
                    }
                    catch (Exception ex)
                    {
                        dto.Reply = ex.Message;
                        color = Color.FromRgb(255, 0, 0);
                    }
                    dto.Color = new SolidColorBrush(color) { Opacity = 0.45 };
                }
            };
            bw.RunWorkerAsync();

关于c# - 如何在 WPF DataGrid 中突出显示一行并强制刷新行/单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724369/

相关文章:

c# - List.Add 方法不起作用

c# - C#HTML代码阅读器

.net - StreamWriter 以 Lf 而不是 CrLf 结束行

.net - Linq - 行未找到或更改

c# - 获取 ListViewItem 子项

c# - 如何将 XAML 代码的动画转换为 C#

c# - 如何设计自定义文字/语音气球?

c# - 如何创建硬编码列表?

c# - Entity Framework Core Fluent Modelbuilder 键和属性

c# - FocusLost 在用户控制 [wpf]