簡體   English   中英

在ListBox.Items更改后引發事件

[英]Raise an event after ListBox.Items has changed

任何人都知道如何在重繪ListBox時引發事件。 我正在嘗試有條件地屏蔽一列中的內容,但是條件檢查似乎是在繪制列表框之前完成的,因此該屏蔽不起作用,因為沒有要屏蔽的內容:

    /// <summary>
    /// Locks or unlocks the quantity textbox based on 100% flour and activates or deactivate weights
    /// </summary>
    private void activatePieceQuantity()
    {
        if (isFlour100Percent())
        {
            ((TextBox)NumberOfItemsTextBox as TextBox).IsEnabled = true;
            weightsActive(true);
        }
        else
        {
            ((TextBox)NumberOfItemsTextBox as TextBox).IsEnabled = false;
            weightsActive(false);
        }
    }

    /// <summary>
    /// Send controls to search with control name and activate or deactivate flag
    /// </summary>
    /// <param name="activate"></param>
    private void weightsActive(bool activate)
    {
        int locationInList = 0;
        foreach (RecipieIngredient ri in activeRecipie.RecipieIngredients)
        {
            SearchTree(this.IngredientsListBox.ItemContainerGenerator.ContainerFromIndex(locationInList), "QuanityWeight", activate);
            locationInList++;
        }
    }

    /// <summary>
    /// Find all weight related objects in the ingredients list and set the visibility accordingly
    /// </summary>
    /// <param name="targetElement"></param>
    /// <param name="flagName">Derived from the Tag of the textbox</param>
    /// <param name="enableFlag"></param>
    private void SearchTree(DependencyObject targetElement, string flagName, bool enableFlag)
    {
        if (targetElement == null)
            return;
        var count = VisualTreeHelper.GetChildrenCount(targetElement);
        if (count == 0)
            return;

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(targetElement, i);
            if (child is TextBlock)
            {
                TextBlock targetItem = (TextBlock)child;

                if (targetItem.Name == flagName)
                    if (enableFlag)
                    {
                        ((TextBlock)targetItem as TextBlock).Visibility = Visibility.Visible;
                        return;
                    }
                    else
                    {
                        ((TextBlock)targetItem as TextBlock).Visibility = Visibility.Collapsed;
                    }
            }
            else
            {
                SearchTree(child, flagName, enableFlag);
            }
        }
    }

我現在知道了,問題是調用SearchTree函數時沒有繪制ListBox,所以從沒有任何DependencyObject傳遞給它。

我通過在代碼中放置一個標記以表明檢查已完成,然后從LayoutUpdated事件中調用masking函數,解決了該問題(我認為有些黑)。

    private void IngredientsListBox_LayoutUpdated(object sender, EventArgs e)
    {
        if (ingredientsListLoaded)
        {
            activatePieceQuantity();
            ingredientsListLoaded = false;
        }
    }

暫無
暫無

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

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