9

WPF グリッドにバインドしたいコレクションがあります。

私が直面している問題は、列の数が動的であり、コレクションに依存していることです。以下は簡単なモックアップです。

public interface IRows
{
    string Message{get;}
    IColumns[] Columns{get;}
}

public interface IColumns
{
    string Header {get;}
    AcknowledgementState AcknowledgementState{get;}
}

public interface IViewModel
{
    ObservableCollection<IRows> Rows {get;}
}

ビューを、列のコレクションを含む行コレクションにバインドしたいと考えています。

私の列コレクションには、画像 (3 つの可能性のうちの 1 つ) で表す必要がある列挙型が含まれています。また、1 つの列にのみ表示される Message プロパティも含まれます (静的で、テキスト情報のみ)。また、その列のヘッダーとして表示されるヘッダー文字列も含まれています。

見せたいものへのリンク

列の数は可変であることに注意してください (現時点ではヘッダーは Acknowledge に設定されていますが、これは動的データを表すように変更されます)。

更新: これは、レイチェルからの提案を実装した後です

    <ItemsControl
 ItemsSource="{Binding Items, Converter={StaticResource PresentationConverter}}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <Grid ShowGridLines="true"
         local:GridHelpers.RowCount="{Binding RowCount}"
         local:GridHelpers.ColumnCount="{Binding ColumnCount}" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemContainerStyle>
    <Style>
      <Setter Property="Grid.Row" Value="{Binding RowIndex}"/>
      <Setter Property="Grid.Column" Value="{Binding ColumnIndex}"/>
    </Style>
  </ItemsControl.ItemContainerStyle>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <ContentControl Content="{Binding}">
        <ContentControl.Resources>
          <DataTemplate DataType="{x:Type UI:MessageEntity}">
            <TextBox Text="{Binding Message}"></TextBox>
          </DataTemplate>
          <DataTemplate DataType="{x:Type UI:StateEntity}">
            <TextBox Text="{Binding State}"></TextBox>
          </DataTemplate>
        </ContentControl.Resources>
      </ContentControl>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

これは、私が今欲しいものをほとんど与えてくれます。私はヘッダーのために何をすべきかだけにこだわっています。どんな提案でも大歓迎です。

4

4 に答える 4

7

ItemsControlsこれにはネストされたものを使用できます

基本的な例を次に示します。

<!-- Bind Rows using the default StackPanel for the ItemsPanel -->
<ItemsControl ItemsSource="{Binding Rows}">
    <!-- Set the Template for each row to a TextBlock and another ItemsControl -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <!-- Need to set Width of name TextBlock so items line up correctly -->
                <TextBlock Width="200" Text="{Binding Name}" />

                <ItemsControl ItemsSource="{Binding Columns}">
                    <!-- Use a horizontal StackPanel to display columns -->
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
于 2012-12-11T16:43:22.583 に答える
2

グリッド アプローチを使用すると、必要以上に複雑になる可能性があります。リストビューのテンプレートを変更したり、代わりに DataGrid を使用したりしましたか?

例として、このプロジェクトを見てみましょう: http://www.codeproject.com/Articles/25058/ListView-Layout-Manager

またはこれ: http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView

グリッドを使用する場合、列と行の量、サイズ、セルの内容を管理するために多くのコードを追加する必要があると思います... 一方、ListView/DataGrid を使用すると、これを動的に行うことができますテンプレート。

于 2012-12-11T12:16:06.333 に答える
1

http://msdn.microsoft.com/en-us/library/system.windows.controls.grid(v=vs.90).aspx#feedbackに示されているコードを使用してグリッドを作成します。

タイプ ColumnDefinition のプロパティを作成し、(変更されたプロパティを使用して) 列を作成します。

于 2014-01-10T00:45:16.470 に答える
0

動的オブジェクトを使用して列を作成するオプションもあります。これは少し手間がかかりますが、結果は非常に効果的で、ソリューションは一般的に非常に柔軟です。

これにより、動的オブジェクトの基本が表示さ れます 自動列生成を使用して DynamicObject を DataGrid にバインドしますか?

ネストされたオブジェクト、オブジェクトを持つ列で使用し、セルの内容をオブジェクトにバインドしようとすると、問題が発生しました。

これは、これを行う方法の例で私が提起した質問です

XAML で WPF DataGridCell のコンテンツにバインドする際の問題

于 2014-11-07T12:25:18.190 に答える