簡體   English   中英

WPF TreeView項目更新-容器檢索

[英]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.

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