Il y a quelques difficultés ici. Tout d'abord, voici mon code:
<ItemsControl x:Name="TaskBarItems">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Converter={StaticResource groupName}}"
FontWeight="Bold" />
<ItemsControl ItemsSource="{Binding}"
Margin="12 0 0 0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding DisplayName}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
et mon Shell:
public class ShellViewModel : IShell
{
readonly TaskBarItemViewModel[] taskBarItems;
public ShellViewModel()
{
taskBarItems = new[]
{
new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Monkey"},
new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Cat"},
new TaskBarItemViewModel {GroupName = "Animal", DisplayName = "Dog"},
new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Biotite"},
new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Phlogopite"},
new TaskBarItemViewModel {GroupName = "Mineral", DisplayName = "Lepidolite"},
};
}
public IEnumerable<IGrouping<string, TaskBarItemViewModel>> TaskBarItems
{
get
{
return taskBarItems.GroupBy(t => t.GroupName).ToList();
}
}
}
Calibrun Micro (cm) va se lier ItemsControl, TaskBarItems, par convention. Cependant, le reste ne fonctionnera pas par convention pour plusieurs raisons. C'est dans un DataTemplate, donc nous utiliserions habituellement Bind.Model. Cependant, cela ne fonctionnera pas ici car le type de chaque élément dans itemscontrol est générique (IGrouping). Les conventions par défaut ne peuvent pas gérer la recherche d'une vue pour cela. Nous fournissons donc un modèle de données en ligne.
Deuxièmement, la propriété Key semble être implémentée en tant qu'interface explicite. Cela signifie que Silverlight ne peut pas s'y lier. Je fait un convertisseur simple qui se lie au groupe et extrait la clé:
public class GroupNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((IGrouping<string,TaskBarItemViewModel>)value).Key;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Ensuite, puisque le groupe lui-même est le IEnumerable que nous devons lier directement l'ItemsSource de ItemsControl imbriqué. Nous ne pouvons pas utiliser de conventions car il n'y a pas de propriété sur IGrouping qui renvoie les éléments. (Bien que, si c'était le cas, nous aurions probablement encore le problème d'interface explicite.)
En ce qui concerne votre deuxième question. Vous pouvez lier une action à n'importe quel événement. Consultez la documentation ici: http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation
Désolé, cela a été 4 mois après que vous en aviez besoin. –
Merci pour la réponse exhaustive, il sera utile à quelqu'un d'autre, à coup sûr et j'ai aussi appris beaucoup de choses qui viendront à portée de main une autre fois :) – Jan