2012-12-11 38 views
6

WPFグリッドにバインドしたいコレクションがあります。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;} 
} 

私のビューは、列のコレクションを含む行コレクションにバインドする必要があります。

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

The link to what I want to show

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

更新:これはこれはほとんど私が今欲しいものを私に与えレイチェル

<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> 

からの提案を実施した後です。私はヘッダーのために何をしなければならないのかに悩んでいます。 ご提案は大歓迎です。

+0

を行う最大の情報を提供する方法の一例で提起質問ですね。リンクを含む... – Harry

+0

簡体字でリンクを追加しました。 – zman

+0

行と列を動的に追加する方法のリンク - http://stackoverflow.com/questions/13344788/how-to-create-listview-to-a-grid-programmatically/ – Sai

答えて

5

あなたはここで基本的な例です。この

のためのネストされた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> 
+0

これはほとんど私が欲しいものです。私はこのアイデアを使用してソリューションを実装しようとしましたが、ItemsControl(それより上のスタックパネル)とは独立したヘッダー行を追加したときに問題が見つかりました。列の幅を並べて同期させるのは非常に難しいことです。 – zman

+1

@ManuelZanin [SharedSizeScope](http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.issharedsizescope.aspx)添付プロパティを持つグリッドを使用できますが、あらかじめ列の定義を定義します。列の数が変わる可能性がある場合、グリッド[http://bloghel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/]の添付プロパティがいくつかあります。 ColumnDefinitionsを手動で指定する代わりに、列数をバインドすることができます。 – Rachel

+0

私はあなたの提案のおかげでほとんど働いています。私は私の質問を更新しました。残っている唯一の問題は、ヘッダーをうまく処理する方法です。 ItemsControlを使って動作させることができない場合は、ListViewを使用する必要があります(このコントロールにはあま​​り慣れていませんが)。 – zman

2

グリッドアプローチを使用すると、物事が複雑になる可能性があります。あなたは、リストビューのテンプレートを変更しようとしましたか、代わりにこの目的のためにDataGridを使用しましたか?例えば

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

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

あなたがグリッドで行く場合、私はあなたがに後ろに多くのコードを追加する必要があります信じています列と行のサイズ、セルのサイズ、セルの内容を管理します。ListView/DataGridを使用すると、テンプレートを使用してこれを動的に実行できます。

+0

これらのリンクは、私が見たコラムコレクションを扱っていません。 – Paparazzi

+0

@Blamそして彼らはグリッドも扱っていない!これはまさに私の要点です:ListView内のDataTemplateは、OPのシナリオに適したソリューションかもしれません。私がWPFを始めたとき、私はかつて不明な量の列とヘッダーを持つグリッドを生成し、最終的にListViewについて学びました。そして、この種の問題を簡単にする方法を学びました。 XAMLソリューション。 – Joe

+0

あなたは良い点を作っています。多分私は人生を自分のために難しくしています。私はListView/GridViewを使用することを考えましたが、私が望むものを達成するためにそれらを使用する例は見つかりませんでした(私はWPFで役に立たない)。あなたが投稿した例は便利ですが、私はそれが自分の目的にとって過度のものだと思っています。 – zman

0

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

これは、私はいくつかの問題ネストされたオブジェクト、オブジェクトを持つ列でそれを使用して、オブジェクトにセルの内容をバインドしようとしていた Binding DynamicObject to a DataGrid with automatic column generation?

動的オブジェクトにあなたの基本を表示します。

ここで私は、助けを受信するには、この

Problems binding to a the content of a WPF DataGridCell in XAML

関連する問題