1

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を使うべきではありませんか?多分他の/より良い解決策がありますか?

4

1 に答える 1

0

私がやったことは:

  • すべてのColumnDefinitionsとRowDefinitionsでグリッドを作成します(必要な数はわかっています)
  • ビューのコードビハインドで、DataContextを自分が知っているものにキャストします
  • コレクションを繰り返し処理し、アイテムごとに新しいコントロールを作成し、そのDataContextをアイテムに設定します
  • 次に、RowPropertyとColumnPropertyを設定し、このコントロールをグリッドに追加します
  • また、これらすべてのコントロールをどこに追加したかを覚えているので、まだ存在しないグリッドに空のコントロールを追加できます。

これは、パフォーマンス上の理由で変更すると思います。-アイテムのコレクションを反復処理する代わりに、グリッドのすべての可能なセルを反復処理し、(常に)コントロールを追加し、対応するアイテムがある場合はDataContextを設定します。

これを行う理由はパフォーマンスです。グリッドを埋めるのに約2秒かかりますが、もっと速くしたいと思います。

于 2011-01-20T15:14:16.997 に答える