2012-01-05 79 views
0

我在.Net3.5中使用DataGrid來顯示用戶可以切換的幾種不同數據源。每個數據源都使用一個新的DataGrid,但其背後的代碼對所有這些數據都是通用的,因此不知道數據的真實內容。標題標題和綁定到DataGrid的ItemsSource中的對象由XML文件控制,該文件首次創建DataGrid時創建鏈接。DataGrid'no data'row:BindingExpression路徑錯誤

我也解決了DataGrid中沒有行導致水平滾動條消失的問題。這是因爲我需要用戶仍然能夠滾動瀏覽標題,以便移除那些可能導致缺乏結果的過濾器。這一切都是通過一個Converter來完成的,如果它發現當前綁定的集合沒有返回任何行,它將添加一個EmptyRow的集合。

我的問題是,這EmptyRow不包含由標準行持有的屬性,所以無論何時將其添加到DataGrid中,顯然都有綁定路徑錯誤,即使這些錯誤不會停止將行添加爲空白行。

無論如何,如果有人能指出我正確的方向,我寧願不要有約束力的問題。

更新 - 轉換器總是返回一行

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    if (values.Length == 2 && values[1] != null) 
    { 
     bool isEmpty; 
     if (bool.TryParse(values[1].ToString(), out isEmpty) && isEmpty) 
     { 
      return new List<EmptyRow> {new EmptyRow()}; 
     } 
    } 
    return values.FirstOrDefault(); 
} 

包含當前資源集合,並且該集合的IsEmpty屬性。如果集合爲空,它將返回一個EmptyRow的集合,而不是空集合。這是通用DataGrid的轉換器,原始集合可以是幾種集合類型之一。因此,我總是遇到綁定問題,因爲EmptyRow不滿足DataGrid設置期望的屬性。

回答

0

根據最新評論更新。

我可以在這裏看到兩個選項:

  1. 創建所有對象的屬性名稱的不同列表,並將它們添加到您的EmptyRow。聽起來很討厭 - 但它會工作。這樣你會得到一個通用對象。缺點是每當你修改你的實際對象時,你都需要保持EmptyRow是最新的。

  2. 更改對象expandos的,因此而不是

    字符串屬性名 { 搞定; 得到; }

有一個索引,如:具有在地方,你可以隨時返回東西未知屬性

object Property[string propertyName] 
{ 
    get { ... } 
    set { ... } 
} 

。這將迫使您爲每個值使用Converter。

+0

我已經有一個轉換器,它在'真正'集合中沒有檢測到條目時返回一個EmptyRow對象的集合。將其更改爲Binding.DoNothing將不會返回EmptyRow,從而導致沒有行以及消失的水平滾動條的原始問題。除非這不是你的意圖? – Jason 2012-01-05 13:28:34

+0

你如何強制你的EmptyRow出現在網格上?我曾以爲你正在爲你的網格的ItemsSource集合添加一個虛擬物品(在這種情況下,與轉換器相比,使用服務更爲合適)。去那條路線你應該得到沒有綁定錯誤。 – 2012-01-05 13:39:58

+0

更新了原始問題以顯示我的轉換方法(在IMultiValueConverter實現中)。希望能夠顯示我所做的。我實際上並不知道目前在任何特定數據網格中哪種類型的行,這就是爲什麼我有EmptyRow。 – Jason 2012-01-05 13:52:57