2010-08-05 65 views
2

我有一個基本問題:WPF DataGrid Binding and CheckBox

比方說,我有一個類的元素列表。我也有一個DataGrid顯示這個列表項目的屬性。我希望用戶通過額外的複選框列(實際上是datagridtemplatecolumn)來選擇一些項目。然後他按下按鈕,只有選定的項目被某些功能處理。 我應該如何實現這個複選框的邏輯?

  1. 我應該添加一個布爾屬性到我的類,並將其綁定到複選框列? (我認爲,爲了UI而向我的核心類添加額外的屬性並不好)

  2. 我應該製作一些包含布爾屬性並將DataGrid綁定到包裝類列表的包裝類嗎? (比第一個變體更符合OOP規則)

  3. 製作未綁定的複選框列。然後檢查循環中的datagrid行以在處理之前收集選定的項目。 (這是我想做的事情,但未綁定的複選框列的行爲真的很奇怪:當我切換一個複選框時,其他幾個複選框也被切換,而且我也沒有找到一種方法來查看DataGrid的所有行)。

  4. 你變...

而且我想根據OOP的規則做到這一點的東西。這是主要要求。這就是爲什麼我不能接受第一個變體,除非你說我沒問題,並且經常使用。

回答

1

我投給了#2;它凝結了MVVM模式,我認爲這是WPF中直接開發的唯一方法。通過這種方式,您將創建一個視圖模型類,它包裝您的域對象以處理複選框和更改屬性之間的通信等,同時觸發PropertyChanged事件並使您的UI保持最新狀態。

-1

我們已經與同樣的困境掙扎,並最終結束了加入一個布爾屬性類的IsSelected爲什麼選擇的#1?當它真的來到了它:

  • 這是最簡單的
  • 可以改用於任何類型的結合
  • 終於......因爲Josh Smith使用IsSelected *

當然,這可能會違反一些黃金MVVM規則,但有時候,規則意味着被打破。


*我不記得喬希提供確切的例子,但是你可以看到他使用在他的博客文章之一:The Initially Selected Item when Binding to a Grouped ICollectionView

+0

我有同樣的想法,但一旦我檢查數據網格中的複選框,Ilist不會得到更新,你有一個你如何做的例子嗎? 謝謝! – 2012-11-26 19:14:23

+0

@GerardoJaramillo - 我建議你開始一個新的問題,也許在你的文章中引用這個問題。一定要包括您的相關代碼片段和其他任何有助於社區複製問題的內容。 – 2012-11-26 21:26:12

0

傢伙我只是嘗試這種解決方案和工作的偉大,也許是不最好的但它的工作。

bool? valor = false; 
       foreach (var d in DetalleFactura.Items) 
       { 
        DataGridRow row = (DataGridRow)DetalleFactura.ItemContainerGenerator.ContainerFromItem(d); 
        if (DetalleFactura.Columns[0].GetCellContent(row) is CheckBox) 
        { 
         valor = ((CheckBox)DetalleFactura.Columns[0].GetCellContent(row)).IsChecked; 

        } 

       }