gpt4 book ai didi

c# - 更新 LINQ 子句中的属性会破坏与 UI 的数据绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:59 24 4
gpt4 key购买 nike

我遇到一个问题,当基础数据属性发生变化时,Silverlight UI 数据网格没有更新。如果我引入一个临时变量并更新一个 block 中的数据,我可以使它工作,但不明白为什么原始代码不起作用。

这是 web UI 部分的 xaml 代码:

<C1:C1DataGrid ItemsSource="{Binding DeliveryAccuracyTotals}" 
HeadersVisibility="Column"
AutoGenerateColumns="False">
<C1:C1DataGrid.Columns>
<C1:DataGridDateTimeColumn Binding="{Binding PlannedAcceptanceDate}"
Header="{Binding Date,
Source={StaticResource res}}"
Format="dd.MM.yyyy" />
<C1:DataGridNumericColumn Binding="{Binding OKcount}"
Header="{Binding OK, Source={StaticResource res}}" />
<C1:DataGridNumericColumn Binding="{Binding NOKcount}"
Header="{Binding NOK, Source={StaticResource res}}" />
<C1:DataGridNumericColumn Binding="{Binding OKpercentage}"
Header="%" Format="0.##"/>
</C1:C1DataGrid.Columns>
</C1:C1DataGrid>

我有一个回调处理程序,用于在异步数据获取完成时处理数据:

private void handleDeliveryAccuracyReportDataCallBack(List<DeliveryAccuracyReportDataRow> data)
{
DeliveryAccuracyTotals.Clear();
if (data != null)
{
data.GroupBy(row => row.PlannedAcceptanceDate)
.ToList()
.ForEach(group =>
DeliveryAccuracyTotals.Add(new DeliveryAccuracyTotalData(group.ToList())));
}
}

这使用以下属性通知 UI 更改。

public List<DeliveryAccuracyTotalData> DeliveryAccuracyTotals
{
get
{
if (_deliveryAccuracytotals == null)
{
_deliveryAccuracytotals = new List<DeliveryAccuracyTotalData>();
}
return _deliveryAccuracytotals;
}
private set
{
_deliveryAccuracytotals = value;
NotifyPropertyChanged("DeliveryAccuracyTotals");
}
}

如果我运行它,DeliveryAccuracyTotals 属性会正确填充新数据,但 UI 不会显示新数据!

但是,当我将回调代码更改为此时,它起作用了:

private void handleDeliveryAccuracyReportDataCallBack(List<DeliveryAccuracyReportDataRow> data)
{
var temp = new List<DeliveryAccuracyTotalData>();
if (data != null)
{
data.GroupBy(row => row.PlannedAcceptanceDate)
.ToList()
.ForEach(group =>
temp.Add(new DeliveryAccuracyTotalData(group.ToList())));
}
DeliveryAccuracyTotals = temp;
}

谁能解释一下这里发生了什么?我怀疑它与 ForEach() 和/或闭包有关。

最佳答案

只有当您为 DeliveryAccuracyTotals 字段设置新值时,您才会触发 NotifyPropertyChanged。您不会在列表发生变化时触发事件,只有在设置全新列表时才会触发。

如果该属性是一个 ObservableCollection,那么 UI 将能够添加一个处理程序来接收对集合本身发生变化的通知,而不仅仅是对保存列表的变量的更改,但是如果您打算完全从头开始重新创建集合,而不是仅仅进行一些更改,那么将新集合分配给该属性并不是真正的问题。

关于c# - 更新 LINQ 子句中的属性会破坏与 UI 的数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com