2011-06-23 39 views
1

私は2つの列を持つGridViewでListViewを持つC#(.NET 4.0)のWPFアプリケーションで作業しています。複数の列にデータ(テキストだけでなく)を追加ListView(WPF)

動的にコードを追加する必要があります。私のジレンマは、最初の列にのみ通常のテキストが追加されることです。 2番目の列には、TextBlockを持つ複数列のグリッドを含むオブジェクトがあります。 (リンクhttp://imageshack.us/photo/my-images/803/listview.png/を参照)

すべての列にテキストを入力する場合(DisplayMemberBinding)、2番目の列にあるテキストはすべて "System.Windows.Grid"というテキストです。明らかに私が望むものではありません。

参照用に、TextBlocksを持つGridオブジェクトを、DisplayView1.Items.Add(grid1)というコードで追加しようとすると(DisplayMemberBindingを使用しない)、オブジェクトは2番目の列にのみ追加されます(最初の列空白になります)、同じテキストがすべての列で終わるテキストでは通常どのように動作しますか。

私の質問が十分詳しく説明されており、これに関する助けがあれば幸いです。

EDIT:

私はhoweever、私はすべての単一の行が同じのDataTemplateで更新され、新しい行を追加するためのボタンをクリックするたびに次のコードを試してみました。 (。すなわち列は常にすべての行に同じデータを示しています。)

XAML:

<Window x:Class="TEST.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Name="AAA" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid Name="grid1"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="374*" /> 
     <ColumnDefinition Width="129*" /> 
    </Grid.ColumnDefinitions> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="21,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Grid.Column="1" Click="button1_Click" /> 
</Grid> 

コード:あなたが使用する必要はありません

  public partial class MainWindow : Window 
{ 

    ListView listView1 = new ListView(); 
    GridViewColumn viewCol2 = new GridViewColumn(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     Style style = new Style(typeof(ListViewItem)); 
     style.Setters.Add(new Setter(ListViewItem.HorizontalContentAlignmentProperty, 
      HorizontalAlignment.Stretch)); 
     listView1.ItemContainerStyle = style; 

     GridView gridView1 = new GridView(); 
     listView1.View = gridView1; 
     GridViewColumn viewCol1 = new GridViewColumn(); 
     viewCol1.Header = "Option"; 
     gridView1.Columns.Add(viewCol1); 
     viewCol2.Header = "Value"; 
     gridView1.Columns.Add(viewCol2); 
     grid1.Children.Add(listView1); 
     viewCol1.DisplayMemberBinding = new Binding("Option"); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     DataTemplate dataTemplate = new DataTemplate(); 

     FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(Grid)); 

     Random random = new Random(); 
     int cols = random.Next(1, 6); 
     int full = 100; 
     for (int i = 0; i < cols; i++) 
     { 
      FrameworkElementFactory col1 = new FrameworkElementFactory(typeof(ColumnDefinition)); 
      int partWidth = random.Next(0, full); 
      full -= partWidth; 
      col1.SetValue(ColumnDefinition.WidthProperty, new GridLength(partWidth, GridUnitType.Star)); 
      spFactory.AppendChild(col1); 
     } 
     if (full > 0) 
     { 
      FrameworkElementFactory col1 = new FrameworkElementFactory(typeof(ColumnDefinition)); 
      col1.SetValue(ColumnDefinition.WidthProperty, new GridLength(full, GridUnitType.Star)); 
      spFactory.AppendChild(col1); 
     } 
     for (int i = 0; i < cols; i++) 
     { 
      FrameworkElementFactory text1 = new FrameworkElementFactory(typeof(TextBlock)); 
      SolidColorBrush sb1 = new SolidColorBrush(); 
      switch (i) 
      { 
       case 0: 
        sb1.Color = Colors.Blue; 
        break; 
       case 1: 
        sb1.Color = Colors.Red; 
        break; 
       case 2: 
        sb1.Color = Colors.Yellow; 
        break; 
       case 3: 
        sb1.Color = Colors.Green; 
        break; 
       case 4: 
        sb1.Color = Colors.Purple; 
        break; 
       case 5: 
        sb1.Color = Colors.Pink; 
        break; 
       case 6: 
        sb1.Color = Colors.Brown; 
        break; 
      } 
      text1.SetValue(TextBlock.BackgroundProperty, sb1); 
      text1.SetValue(Grid.ColumnProperty, i); 
      spFactory.AppendChild(text1); 
     } 
     if (full > 0) 
     { 
      FrameworkElementFactory text1 = new FrameworkElementFactory(typeof(TextBlock)); 
      SolidColorBrush sb1 = new SolidColorBrush(Colors.Black); 
      text1.SetValue(TextBlock.BackgroundProperty, sb1); 
      text1.SetValue(Grid.ColumnProperty, cols); 
      spFactory.AppendChild(text1); 
     } 

     dataTemplate.VisualTree = spFactory; 

     viewCol2.CellTemplate = dataTemplate; 


     int rows = listView1.Items.Count + 1; 
     listView1.Items.Add(new { Option = "Row " + rows }); 

    } 
} 

答えて

0

DisplayMemberBinding、複雑なコンテンツの場合はCellTemplateを使用できます。例:

<ListView ItemsSource="{Binding Data}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Name}" /> 
      <GridViewColumn> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <!-- This should display your grid if it is a property on your item called GridProperty --> 
         <ContentControl Content="{Binding GridProperty}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

私は実際にダイナミックなdatattemplatesを作成することに夢中になりましたが、作成された最新のテンプレートで更新されているすべての行の2番目の列に終わってしまいました。どのようにして各行が2番目の列に異なる動的データを表示できるようにするかを理解できません。 – user811804

+0

データテンプレートの使用方法を理解していないようで、ボタンをクリックするたびにデータテンプレートを再作成するように見えますが、ソースコレクションにデータを追加してビジュアルに変換する必要があります静的データ・テンプレートによる表現。 –

+0

はい、それは私がやっていることです。申し訳ありませんが、私はWPFの新機能です。問題は、静的なデータ型を使用することができないと私は信じている。なぜなら、その中のコントロールはすべての行に対して動的でなければならないからだ。それで私の問題に近づける最善の方法は何ですか?上のコードを見ると、私が達成しようとしていることのヒントが少なくとも欲しいと思います。 – user811804

関連する問題