[.net] كيف يعمل IconContainerGenerator.ContainerFromItem مع قائمة مجمعة؟


Answers

حاول تحليل فيسوالتري من 'الشيء' حتى تصل إلى نوع ليستبوكسيتم

Question

لدي قائمة ليستبوكس التي كانت حتى وقت قريب عرض قائمة مسطحة من العناصر. كنت قادرا على استخدام myList.ItemContainerGenerator.ConainerFromItem (الشيء) لاسترداد ليستبوكسيتم استضافة "شيء" في القائمة.

هذا الأسبوع لقد قمت بتعديل ليستبوكس قليلا في أن كولكتيونفيوسورس أن يربط إلى لعناصره قد تجميع تمكين. الآن يتم تجميع العناصر داخل ليستبوكس تحت رؤوس لطيفة.

ومع ذلك، منذ القيام بذلك، البندConContainerGenerator.ContainerFromItem توقفت عن العمل - فإنه يعود فارغة حتى بالنسبة للعناصر وأنا أعلم في ليستبوكس. هيك - كونتينرفروميندكس (0) يعود نول حتى عندما يتم ملء ليستبوكس مع العديد من العناصر!

كيف يمكنني استرداد ليستبوكسيتم من قائمة مربع تعرض عناصر مجمعة؟

تحرير: وهنا زمل ورمز خلف للحصول على مثال قلص أسفل. هذا يثير نولريفيرنسكسيبتيون لأن كونتينفرفروميندكس (1) يعود نول على الرغم من أن هناك أربعة عناصر في القائمة.

XAML:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    Title="Window1">

    <Window.Resources>
        <XmlDataProvider x:Key="myTasks" XPath="Tasks/Task">
            <x:XData>
                <Tasks xmlns="">
                    <Task Name="Groceries" Type="Home"/>
                    <Task Name="Cleaning" Type="Home"/>
                    <Task Name="Coding" Type="Work"/>
                    <Task Name="Meetings" Type="Work"/>
                </Tasks>
            </x:XData>
        </XmlDataProvider>

        <CollectionViewSource x:Key="mySortedTasks" Source="{StaticResource myTasks}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="@Type" />
                <scm:SortDescription PropertyName="@Name" />
            </CollectionViewSource.SortDescriptions>

            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="@Type" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>

    <ListBox 
        x:Name="listBox1" 
        ItemsSource="{Binding Source={StaticResource mySortedTasks}}" 
        DisplayMemberPath="@Name"
        >
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}"/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListBox.GroupStyle>
    </ListBox>
</Window>

CS:

public Window1()
{
    InitializeComponent();
    listBox1.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    if (listBox1.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
    {
        listBox1.ItemContainerGenerator.StatusChanged -= ItemContainerGenerator_StatusChanged;

        var i = listBox1.ItemContainerGenerator.ContainerFromIndex(1) as ListBoxItem;

        // select and keyboard-focus the second item
        i.IsSelected = true;
        i.Focus();
    }
}





Links