Yakın zamana kadar düz bir öğe listesi görüntüleyen bir ListBox'ım var. ListlistItem "şey" barındıran almak için myList.ItemContainerGenerator.ConainerFromItem (thing) kullanabildi.ItemContainerGenerator.ContainerFromItem gruplandırılmış bir liste ile nasıl çalışır?
Bu hafta, ListBox'ı, öğelerini için gruplandırmasını etkinleştirdiği CollectionViewSource öğesinin etkin olduğundan biraz değiştirdim. Şimdi, ListBox içindeki öğeler güzel başlıkların altında gruplandırılmıştır.
Ancak, bunu yaptığınızda, ItemContainerGenerator.ContainerFromItem çalışmayı durdurdu - ListBox'ta olduğunu bildiğim öğeler için bile null değerini döndürür. Heck - ListBox birçok öğe ile doldurulmuş olsa bile ContainerFromIndex (0) null döndürüyor!
Gruplanmış öğeleri görüntüleyen bir ListBox Listesinden bir ListBoxItem'i nasıl alabilirim?
Düzenleme: Kesilmiş bir örnek için XAML ve kod arkası işte burada. Listede dört öğe olsa bile, ContainerFromIndex (1) null döndürdüğü için bu bir NullReferenceException yükseltir.
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();
}
}
Ne yapıyorsun
Kullanımını vermek konteyner ile? Önceki kodun gerçekte ne işe yaradığını görmek mümkün mü? Konteyneri almanın birkaç yolu var ... sadece onunla ne yapmak istediğinize bağlı? – rudigrobler