2015-05-18 19 views
1

當底層數據屬性更改時,我遇到Silverlight UI數據網格未更新的問題。如果我引入臨時變量並更新一個塊中的數據,但不明白爲什麼原始代碼不起作用,我可以使其工作。更新LINQ子句中的屬性會將數據綁定分解爲UI

這是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()))); 
    } 
} 

它使用以下屬性通知用戶界面的變化。

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

如果我跑這一點,DeliveryAccuracyTotals屬性,都會有新的數據正確填充,但用戶界面不會顯示新的數據!

然而,當我的回調代碼改變這一點,它的工作原理:

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()和/或關閉有關。

回答

2

當您將新值設置爲DeliveryAccuracyTotals字段時,您只會觸發NotifyPropertyChanged。只有在設置了全新列表時,您纔會在列表發生變化時觸發事件。

如果屬性爲ObservableCollection,那麼UI將能夠添加處理程序來獲取對集合本身進行變異的通知,而不僅僅是變量持有列表的變量,但如果您要無論如何都要從頭開始重新創建集合,而不是僅僅進行一些更改,將新集合分配給該屬性並不是一個真正的問題。

+0

你是對的。通過將集合更改爲ObservableCollection進行了測試,並且工作正常。儘管@Aron在他的回答中也有一點意義。 – prudentcoder

1

雖然塞維是正確的是他的分析,我會說他的建議不是最好的。可觀察的集合不會爲您解決您的問題。每次重新綁定一個新集合都會重置樹視圖的狀態(壞的UX)。

你應該看看各種PropertyChanged感知的Linq查詢實現。如,但不限於

  • 綁定的LINQ
  • 連續的LINQ
  • ReactiveUI的衍生觀察集合

我建議RxUI

+0

謝謝,我不知道這些存在。這些在使用Silverlight UI時有什麼限制嗎? – prudentcoder

+0

根據這張票,RxUI 4.x與silverlight一起使用。不過,Silverlight是未來不受支持的技術。您可以考慮改用XBAP/WPF。 – Aron

+0

https://github.com/reactiveui/ReactiveUI/issues/241 – Aron