簡體   English   中英

WPF DataGrid綁定和復選框

[英]WPF DataGrid Binding and CheckBox

我有一個基本的問題:

假設我有某個類的元素列表。 而且我還有一個DataGrid,可以顯示此列表項的屬性。 我希望用戶通過額外的復選框列(實際上是datagridtemplatecolumn)選擇一些項目。 然后他按下按鈕,某些功能僅處理選定的項目。 我應該如何實現此復選框的邏輯?

  1. 我應該在類中添加一個布爾屬性並將其綁定到復選框列嗎? (我認為,僅出於UI的目的向我的核心類添加額外的屬性是不好的)

  2. 我應該制作一些具有布爾屬性的包裝器類,然后將DataGrid綁定到包裝器類的列表嗎? (比第一個變體更好地遵循OOP規則)

  3. 制作一個未綁定的復選框列。 然后在循環之前檢查循環中的datagrid行以收集選定的項。 (這是我想做的,但是未綁定的復選框列的行為確實很奇怪:當我切換一個復選框時,也會切換其他兩個復選框。而且我也沒有找到一種方法來瀏覽DataGrid的所有行)。

  4. 您的變體...

我想根據OOP規則進行操作。 這是主要要求。 這就是為什么我不能接受第一個變體的原因,除非您對我說這沒問題並且經常使用。

我投票支持#2; 它與MVVM模式融合在一起,我認為這是在WPF中進行直接開發的唯一方法。 這樣,您將創建一個視圖模型類,該類將包裝您的域對象以處理復選框與更改屬性等之間的通信,同時觸發PropertyChanged事件並保持UI處於最新狀態。

伙計們,我只是嘗試這種解決方案,並且效果很好,也許不是最好的方法,但是它確實有效。

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;

                    }

                }

我們一直在同一個困境中掙扎,最終選擇了向IsSelected類添加布爾屬性的選項#1,為什么? 真正歸結為:

  • 這是最簡單的
  • 可以重新用於任何類型的綁定
  • 最后...因為Josh Smith使用IsSelected *

當然,這可能違反了某些黃金MVVM規則,但有時規則被打破了。


*我不記得Josh提供的確切示例,但是您可以在他的一篇博客文章中看到他的用法: 綁定到分組的ICollectionView時的初始選擇項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM