ここにはいくつかの困難があります。まず、ここに私のマークアップがあります:
<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>
そして私のシェル:
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) は、慣例により、itemscontrol、TaskBarItems をバインドします。ただし、残りの部分は、いくつかの理由により、規則によって機能しません。これは DataTemplate に含まれているため、通常は Bind.Model を使用します。ただし、itemscontrol 内の各アイテムのタイプはジェネリック (IGrouping) であるため、ここでは機能しません。デフォルトの規則では、そのためのビューの検索を処理できません。そのため、データ テンプレートをインラインで提供します。
次に、Key プロパティは明示的なインターフェイスとして実装されているようです。つまり、Silverlight はそれにバインドできません。グループにバインドしてキーを抽出する単純なコンバーターを作成しました。
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();
}
}
次に、グループ化自体が IEnumerable であるため、ネストされた項目コントロールの ItemsSource を直接バインドする必要があります。IGrouping には項目を返すプロパティがないため、規則を使用できません。(もしあったとしても、おそらく明示的なインターフェースの問題がまだ残っているでしょう。)
2番目の質問について。アクションを任意のイベントにバインドできます。こちらのドキュメントを参照してください:
http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation