这是我关于 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/