2009-02-24 20 views
5

この回答を見つけることができませんでした。WPF - プログラムで追加されたGridViewColumnsのDataTemplateを設定します

私はさまざまな数の列を含むことができるWPF ListViewコントロールを持っています。たとえば、ID、名前、価格、NumberInStock、Manufacturerを表示する商品を含むことができる、顧客データを表示したり、列ID、名前、電子メールなどを表示することができます。

私がやりたいことは、特定の列でデータを別々に表示することです。たとえば、NumberInStock列の値として「Yes」または「No」を印刷する代わりに、きれいなイメージを表示したいとします。

バインドする固定名の固定量のカラムを使用すると、これは簡単なことです。その特定の列のDataTemplateを定義するだけで、それを使用して自分の列のビューを定義します。しかし、私は自分の状況でそれを行う方法を見ることができません。

私はWPFで非常に新しいので、私のアプローチが悪い場合は私には間違いありません:-)私のXAMLではListViewコントロールを定義しました。これはかなり空です。後ろの私のコードでは、私が使用:

// get all columns from my objects (which can be either a Customer of Product) 
    foreach (string columnName in MyObject.Columns) 
     { 
      GridViewColumn column = new GridViewColumn(); 
      // Bind to a property of my object 
      column.DisplayMemberBinding = new Binding("MyObject." + columnName); 
      column.Header = columnName; 
      column.Width = 50; 
      // If the columnname is number of stock, set the template to a specific datatemplate defined in XAML 
      if (columnName == "NumberInStock") 
      column.CellTemplate = (DataTemplate)FindResource("numberInStockImageTemplate"); 
      explorerGrid.Columns.Add(column); 
     } 

は[OK]を、私は(!あなたが何かアドバイスを持っている場合、してください)これは少しきれいに行うことができると確信しているが、最大の問題は、私はすべてのを見ることができないということです列の違い。 'NumberInStock'列のテキスト値を表示するだけです。私のDataTemplateをXAMLで定義されています。もちろん

<Window.Resources> 
<DataTemplate x:Name="NumberInStock" x:Key="NumberInStock"> 
     <Border BorderBrush="Red" BorderThickness="2.0"> 
     <DockPanel> 
      <Image Width="24" Height="24" Margin="3,0" Source="..\Images\instock.png" /> 
     </DockPanel> 
     </Border> 
</DataTemplate> 
</Window.Resources> 

、私はまだそれがNumberInStockの値に応じて、「はい」または「いいえ」画像を表示しなくなる機能を追加する必要がありますが、それは段階であります2本当に。私はリストビューでイメージと赤い枠線を見てうれしいです!事前に

おかげで、 Razzie

答えて

7

これは私をしばらくトライしました。

DisplayMemberBindingおよびCellTemplateは互いに排他的です。 DisplayMemberBindingを指定すると、CellTemplateが無視されます。

MSDNから:

次のプロパティが最高 から最低まで、すべての 列のセルの内容やスタイルを定義するために を使用している、との優先順位の そのためにここに記載されています:

* DisplayMemberBinding 
* CellTemplate 
* CellTemplateSelector 

また、この程度C# Disciples postを参照してください。

+0

ありがとうございます、それは本当に問題のように見えます。 SP1に付属のDataGridコントロールを使用するために、自分のコードを編集しました。とにかく私の状況に適しています。しかし、これは間違いなく正しいソリューションです。どうもありがとう! – Razzie

0

は、私はこの問題は、あなたがFindResource()に渡している文字列を使用すると、XAMLで定義されたリソースのキーと一致していないということだと思います。代わりに"NumberInStock"を渡して、それが機能するかどうか確認してください。

+0

シャープ画像を挿入する最も簡単な方法です!残念ながら、それは単に私の側でコピー・ペースト編集のためのエラーでした。私のコードの正しいキーを指しています。さらに、キーが見つからない場合、FindResource(string)は例外をスローします。とにかくありがとう! – Razzie

2

これは

 GridViewColumn column = new GridViewColumn { Header = "IM" };    
     DataTemplate template = new DataTemplate(); 

     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Grid)); 
     template.VisualTree = factory; 
     FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image)); 

     Binding newBinding = new Binding("IMG"); 
     imgFactory.SetBinding(Image.SourceProperty,newBinding); 
     imgFactory.SetValue(Image.WidthProperty,15.0); 
     imgFactory.SetValue(Image.HeightProperty, 15.0); 

     factory.AppendChild(imgFactory); 
     column.CellTemplate = template; 
     view.Columns.Add(column); 

     ListViewMain.View = view; 

+0

もう少し説明すると役に立つはずですが、これは正しい回答につながります(私の場合)。一言で言えば:_列のコンテンツクリエイターを生成するので、工場で定義されたコントロールを生成するためにファクトリが呼び出されます._ありがとうございます。+1 –

+0

このスタイルは私のために働きました。注:私のバインディングは、子オブジェクトのプロパティのプロパティになっていたので、次のようになりました: 'Binding newBinding = new Binding(" ChildProp.SubProp "); newBinding.Converter = new MyConverter(); ' –

関連する問題