[英]WPF ListBox.SelectedItems as ListBoxItem
有沒有辦法有一個的選擇的項目ListBox
為ListBoxItem
事件SelectionChanged
(在ListBox
在WPF)?
現在,當我調用listBox.SelectedItems
時, listBox.SelectedItems
數據源的格式獲取項目列表。
例如,當我創建我的ListBox
我將其綁定到CustomListBoxViewModel
作為數據源,因此,當我調用SelectedItems
我會得到一個CustomListBoxViewModel
對象的列表。
謝謝!
編輯:
所選答案中給出的代碼非常適合我的用例。
另一方面,我完全理解這違反了MVVM模式。 我將使用您在xaml視圖后面的代碼中提供的代碼。
我的原始問題背后的原因是,我需要實現一個ListBox
,該ListBox
內部具有一些禁用的ListBoxItems
。 這些項目將必須是不可選擇的。
我嘗試在ListBoxItems
上使用附加屬性IsSelectable ,但效果不佳。 此附加屬性受此職位的啟發。 問題是,當我直接選擇一個禁用的項目時,附加屬性可以完美運行。 無法選擇該項目,並且該項目不在SelectedItems集合內。 但是,如果我想通過按CTRL + A來選擇所有項目,則所有ListBoxItems
被選中,甚至禁用的項目也會在SelectedItems集合中找到。
無論出於什么原因,這可能是對MVVM的嚴重違反,您終生都會為之感到遺憾。
但是,邁向滅絕之路的第一步始終很容易。
這是如何做:
var listBox = (ListBox)sender;
var selectedListBoxItems =
listBox.SelectedItems.Cast<Object>()
.Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item))
.ToList();
當一切都以眼淚結束時,別哭了。
沒錯,但很認真,在WPF中有很多充分的理由來做這種事情,但是它們遠不如WPF初學者所期望的那么普遍。 通過使C#代碼僅與數據項交互,並通過樣式和模板對XAML中的ListBoxItem進行處理,可以最好地處理幾乎所有正常情況。 一旦習慣了這種思維方式,它就會非常強大,靈活,高效且可維護。 當所有其他合理途徑均失敗時,Codebehind是您為奇數情況所采取的措施。 例如,拖放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.