[英]WPF TreeView items updating - container retrieval
有點奇怪。
我有一個用客戶對象列表填充的Treeview控件。 有一個搜索功能,可以在樹中某處找到某個對象,該對象具有如下代碼行。
foreach (RbcUICustomer cust in tvQueue.Items)
{
var dataTVI = tvQueue.ItemContainerGenerator.ContainerFromItem(cust) as TreeViewItem;
該樹開始關閉,如果在執行搜索后逐步瀏覽代碼,則整個樹都關閉了,這將為樹中的每個客戶節點返回一個有效的TreeViewItem。 哪個很好,以及您所期望的。
問題是,如果您首先手動打開一個節點,然后執行搜索,則上面的搜索循環將轉到展開的節點,並且上面的ItemContainerGenerator方法返回null,因此找不到該項目的容器。
我假設問題與手動擴展節點時對底層數據的處理有關,這會以某種方式更改它並且無法正確刷新它。 擴展節點背后的商業思想是,它從服務層獲取客戶的客戶帳戶列表,並以編程方式將其可視化地添加到樹中,並擴展該節點。 但是這樣做,似乎阻止了上面的代碼行能夠找到並返回有效容器。
更新客戶的代碼有些復雜,但是我將在下面粘貼其要點。 _customerList是用於保存數據的類數組。
ExpandNode(TreeViewItem item)
{
var cust = item.Header as Customer;
var task = new Task(() => RunBackgroundThreadToAddAccounts(Customer));
task.Start();
}
RunBackgroundThreadToAddAccoutns(Customer)
{
for (var i = 0; i < _customerList.Count; i++)
{
var customer = _customerList[i];
if (customer.CustomerId == cust.CustomerId)
{
customer.Accounts.Clear();
customer.Accounts.Add(LoadingAccount);
_customerList[i] = customer;
UpdateCustomerCompleted(item, i);
break;
}
}
}
private void UpdateCustomerCompleted(TreeViewItem item, int positionIndex)
{
var customer = _customerList[positionIndex];
GUIHelper.Invoke(() => item.Header = customer);
if (customer.Accounts.Count == 0)
{
customer.Accounts.Add(EmptyAccount);
}
GUIHelper.Invoke(() => item.ItemsSource = customer.Accounts);
GUIHelper.Invoke(() => _treeSelectionHandler.ChangeSelectedState(item));
GUIHelper.Invoke(() => item.Items.Refresh());
GUIHelper.Invoke(item.UpdateLayout);
}
有人可以建議上述代碼擴展節點嗎,可能會使樹數據無效,以至於當我嘗試為其檢索容器時,它返回null?
我對您的代碼不太了解,例如:
RunBackgroundThreadToAddAccoutns(Customer)
{
for (var ...
這里的參數是什么,類型是什么?
但是我認為問題可能是當您設置item.ItemsSource = customer.Accounts
您正在將舊項目源更改為新項目,而不是樹之前的版本。
無論如何,如果您在WPF中使用樹,我建議您看一下此引用,這可能對您很有幫助:
http://www.codeproject.com/Articles/17025/Custom-TreeView-Layout-in-WPF
http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode
希望這對您有用...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.