ItemsPanelTemplateとしてグリッドを持つWPFListViewがあります。アイテムのプロパティに基づいて、アイテムを正しい列と行に表示します。しかし、グリッドの空のセルにいくつかのコントロールを配置したいと思います。
これは私のコードとxamlの簡略化されたバージョンです:
リソース内:
<ItemsPanelTemplate x:Key="TheTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
xamlの場合:
<Controls:CustomListView ItemsSource="{Binding TheCollection}"
ItemsPanel="{DynamicResource TheTemplate}">
</Controls:CustomListView>
最後に、私のCustomListViewで:
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
var viewModel = item as DomainObject;
if (viewModel != null)
{
element.SetValue(Grid.ColumnProperty, 1); //here I work with a converter, but this just simplifies it for StackOverflow
element.SetValue(Grid.RowProperty, 1);
}
}
注:DomainObjectにキャストしていることはわかっていますが、ご容赦ください。
これで得られるのは、正しい行と列にアイテムがあるグリッドです。しかし、空のセルに何かを表示したい場合はどうなりますか?たとえば、「null」のようなテキストはどうなりますか?
これをテンプレートに追加することはできません。これは、ItemsControlが必要なコントロールを作成すると言って、アプリケーションをクラッシュさせるためです。コードビハインドでグリッド/テンプレートにアクセスしようとしましたが、その方法がわかりません。たぶん私はListViewを使うべきではありませんか?多分他の/より良い解決策がありますか?