網(wǎng)站制作NEWS
在WPF TreeView中使用Checkbox
每個(gè)項(xiàng)目都綁定到一個(gè) ViewModel 對(duì)象。ViewModel 對(duì)象的檢查狀態(tài)變化會(huì)觸發(fā)父項(xiàng)和子項(xiàng)的檢查狀態(tài)更新。文章還介紹了如何使用附加行為將 TreeViewItem 轉(zhuǎn)換為虛擬 ToggleButton,從而簡(jiǎn)化 TreeView 的鍵盤(pán)交互。
雖然 WPF TreeView 控件本身不提供顯示復(fù)選框的內(nèi)在支持,但我們可以通過(guò)綁定表達(dá)式和屬性來(lái)實(shí)現(xiàn)。每個(gè) TreeViewItem 都包含一個(gè) TreeView,通過(guò)向其屬性添加表達(dá)式,我們可以將復(fù)選框的檢查狀態(tài)綁定到底層數(shù)據(jù)對(duì)象的屬性。WPF 的數(shù)據(jù)綁定功能使得這一過(guò)程變得簡(jiǎn)單。
以下是演示應(yīng)用程序的屏幕截圖:
接下來(lái),我們來(lái)看看具體的功能需求:
要求 1:樹(shù)中的每個(gè)項(xiàng)目都必須顯示一個(gè)復(fù)選框,并顯示底層數(shù)據(jù)對(duì)象的文本和檢查狀態(tài)。
要求 2:當(dāng)一個(gè)項(xiàng)目被選中或取消選中時(shí),其所有子項(xiàng)目也應(yīng)相應(yīng)地被選中或取消選中。
要求 3:如果一個(gè)項(xiàng)目的后代并非都具有相同的檢查狀態(tài),則該項(xiàng)目的檢查狀態(tài)應(yīng)為“不確定”。
要求 4:從一個(gè)項(xiàng)目導(dǎo)航到另一個(gè)項(xiàng)目只需按一次箭頭鍵。
要求 5:按空格鍵或 Enter 鍵可切換所選項(xiàng)目的檢查狀態(tài)。
要求 6:?jiǎn)螕繇?xiàng)目的復(fù)選框可切換其檢查狀態(tài),但不會(huì)選擇項(xiàng)目。
要求 7:?jiǎn)螕繇?xiàng)目的顯示文本可選擇項(xiàng)目,但不會(huì)切換其檢查狀態(tài)。
要求 8:默認(rèn)情況下,樹(shù)中的所有項(xiàng)目都應(yīng)展開(kāi)。
建議將以上要求復(fù)制并粘貼到您喜歡的文本編輯器中,以便在后續(xù)內(nèi)容中按編號(hào)引用。
TreeView 通常與 ViewModel 結(jié)合使用。文章展示了如何使用 ViewModel 封裝與樹(shù)中項(xiàng)目檢查狀態(tài)相關(guān)的特定邏輯。
ViewModel 類(lèi)中最有趣的是 IsChecked 屬性背后的邏輯,它滿足了前面提到的要求 2 和 3。
如果您有不同規(guī)則來(lái)決定項(xiàng)目何時(shí)更新其檢查狀態(tài),只需調(diào)整這些方法中的邏輯即可。
TreeView 配置:
接下來(lái),我們看看如何在 XAML 中配置 TreeView 以顯示復(fù)選框并綁定到 ViewModel。聲明非常簡(jiǎn)單,如下所示:
屬性隱式綁定到 TreeView,其 ItemsSource 數(shù)據(jù)上下文包含一個(gè) ViewModel 對(duì)象,但必須將其放入集合中,因?yàn)樗?IEnumerable 類(lèi)型。
TreeViewItem 的 ItemTemplate 屬性被分配以下內(nèi)容,用于構(gòu)建樹(shù)的模板:
模板包括一個(gè)復(fù)選框,其 Focusable 屬性被設(shè)置為 false,以防止復(fù)選框接收輸入焦點(diǎn)。這可能讓人疑惑,如果沒(méi)有焦點(diǎn),如何將行為附加到復(fù)選框上。
當(dāng) TreeViewItem 觸發(fā)其 KeyDown 事件時(shí),以下邏輯將被執(zhí)行:
多重隨機(jī)標(biāo)簽