2016-02-05 14 views
7

のデータを使用して行を追加する場合は、Dictionary<string, object>に似ています。 stringは列のヘッダーで、objectの値は列の値です。 毎回、新しいデータを取得するときに、列の数が異なる可能性があるため、新しいGridViewを作成しています。 Listでは、myItemsはすべて私の見解で表示したいすべての行Dictionary<string, object>です。画像を含むリストビューに列を追加します。

これは私が私の見解に列を追加する方法です:

  List<Column> columns = new List<Column>(); 

      myItemValues = (IDictionary<string, object>)myItems[0]; 
      // Key is the column, value is the value 
      foreach (var pair in myItemValues) 
      { 
       Column column = new Column(); 
       column.Title = pair.Key; 
       column.SourceField = pair.Key; 
       columns.Add(column); 
      } 
      view.Columns.Clear(); 
      foreach (var column in columns) 
      { 
       Binding binding = new Binding(column.SourceField); 
       if (column.SourceField == "Icon") 
       { 
        view.Columns.Add(new GridViewColumn 
        { 
         Header = column.Title, 
         DisplayMemberBinding = binding, 
         CellTemplate = new DataTemplate(typeof(Image)) 
        }); 
       } 
       else 
       { 
        view.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding }); 
       } 
      } 

直接この後、私は行を追加しよう:

  foreach (dynamic item in myItems) 
      { 
       this.listView.Items.Add(item); 
      } 

私は他の目的のために、このsolutionを変更することしようと試みました。私は唯一のタイプstringの値を追加したい場合は、このソリューションは、非常にうまく動作しますが、今私はまた、GridViewの中imageを表示したいが、私は私のGridViewの1つを追加した場合、それはちょうど私を示しています

「System.Windows.Controls.Image」

は今、私はGridViewの内いずれかのタイプ(または少なくともimagesstrings)を表示することができますように私は私のコードを変更することができれば、知りたいか、私が持っています完全に新しい方法を使用して、方法になりますか?

EDIT:従来のアプローチでは、それは私が画像を表示するために新しいDataTemplateを作成する必要があると、言われましたが、私が見つけた解決策(Solution 1Solution 2)のどれも私のために働いていません。

+0

は 'のCeを設定してみてください列を作成するループ内のデータのタイプに基づいて列の「llTemplate」を作成します。これは、ある列が常に同じタイプのデータを表示する場合です。 データ型を行ごとに変更できる場合は、適切なテンプレートが使用されるように 'CellTemplateSelector'を追加できます。 – Shadowed

+0

私は新しい 'DataTemplate'を作成し、' DataType'を 'typeof(Image)'に設定しました。より多くのプロパティを設定する必要がありますか?私はまだ同じ結果を得ているからです。 – daniel59

+0

これらのソリューションを試してDataTemplateを作成しました:http://stackoverflow.com/questions/248362/how-do-i-build-a-datatemplate-in-c-sharp-code and http://stackoverflow.com/questions/5471405/create-datatemplate-in-code-behindのいずれかが私のために働いています。では、 'gridview'に' images'を提供する 'DataTemplate'をどうすれば作成できますか? – daniel59

答えて

2

リソースのアイコン列にDataTemplateを定義し、アイコンの列を作成するときにDataTemplateをロードすることをお勧めします。アプローチを示すためにコードを修正しました。

XAML

<Window x:Class="ListViewIcon.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ListViewIcon" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <DataTemplate x:Key="iconTemplate"> 
       <Image Source="{Binding Icon}" 
        Width="64" 
        Height="64"/> 
      </DataTemplate> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ListView x:Name="myListView"></ListView> 

    </Grid> 
</Window> 

C#

public class Column 
{ 
    public string Title { get; set; } 
    public string SourceField { get; set; } 
} 

public partial class MainWindow : Window 
{ 
    private BitmapImage LoadImage() 
    { 
     var img = new BitmapImage(); 
     img.BeginInit(); 
     img.UriSource = new Uri(@"D:\image.png", UriKind.Absolute); 
     img.CacheOption = BitmapCacheOption.OnLoad; 
     img.EndInit(); 

     return img; 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     GridView gridView = new GridView(); 
     this.myListView.View = gridView; 

     List<dynamic> myItems = new List<dynamic>(); 
     dynamic myItem; 
     IDictionary<string, object> myItemValues; 

     var image = LoadImage(); 

     // Populate the objects with dynamic columns 
     for (var i = 0; i < 100; i++) 
     { 
      myItem = new System.Dynamic.ExpandoObject(); 

      foreach (string column in new string[] { "Id", "Name", "Something" }) 
      { 
       myItemValues = (IDictionary<string, object>)myItem; 
       myItemValues[column] = "My value for " + column + " - " + i; 
      } 

      myItem.Icon = image; 

      myItems.Add(myItem); 
     } 

     // Assuming that all objects have same columns - using first item to determine the columns 
     List<Column> columns = new List<Column>(); 

     myItemValues = (IDictionary<string, object>)myItems[0]; 

     // Key is the column, value is the value 
     foreach (var pair in myItemValues) 
     { 
      Column column = new Column(); 

      column.Title = pair.Key; 
      column.SourceField = pair.Key; 

      columns.Add(column); 
     } 

     // Add the column definitions to the list view 
     gridView.Columns.Clear(); 

     foreach (var column in columns) 
     { 

      if (column.SourceField == "Icon") 
      { 
       gridView.Columns.Add(new GridViewColumn 
       { 
        Header = column.Title, 
        CellTemplate = FindResource("iconTemplate") as DataTemplate 
       }); 
      } 
      else 
      { 
       var binding = new Binding(column.SourceField); 
       gridView.Columns.Add(new GridViewColumn { Header = column.Title, DisplayMemberBinding = binding }); 
      } 


     } 

     // Add all items to the list 
     foreach (dynamic item in myItems) 
     { 
      this.myListView.Items.Add(item); 
     } 

    } 
} 

結果

enter image description here

+1

ありがとうございます! – daniel59

1

あなたが使用しているアプローチの中でソリューションを一般的にすることができるとは思えません。それは、あなたに合った有効なToString()表現を持つテキストベースのデータ型に対してはうまく動作します。イメージなどの複雑なデータ型を扱う場合は、おそらくTemplatesを陰影として使用する必要があります。ここでは、複合型ごとに異なるプロパティを設定する必要があります。たとえば、画像の場合、ボタン - 背景色のサイズとソースになります。オプションとして、ある種のテンプレートファクトリを作成してCellTemplateSelectorを適用すると、テンプレートテンプレートが提供されますが、これはまったく新しい方法です。

関連する問題