2009-02-24 67 views
5

無法找到此答案。WPF - 以編程方式添加GridViewColumns的設置DataTemplate

我有一個WPF ListView控件可以包含不同數量的列。例如,它可以顯示客戶數據,顯示列ID,名稱,電子郵件等,或者它可以包含產品,顯示ID,名稱,價格,編號,股票,製造商,你會得到這樣的想法:不同數量的列,不同的名稱。

我想要做的是爲某些列顯示不同的數據。例如,我不想打印「是」或「否」作爲NumberInStock列的值,我想顯示一個整齊的圖像。

如果我有一個固定數量的列,固定名稱綁定,我有點看到這很容易。只需爲該特定列定義一個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); 
     } 

好吧,我敢肯定,這可以做一個漂亮一點(如果您有任何建議,請!),但最大的問題是,我看不到任何欄中的差異。它只顯示'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真的。我會很高興在我的ListView中看到圖像和紅色邊框!

由於提前, 金酸莓

回答

7

這讓我絆了一會兒。

DisplayMemberBindingCellTemplate是互斥的。指定DisplayMemberBinding會導致CellTemplate被忽略。

MSDN

下列屬性都用於 定義 列單元格的內容和風格,並在此列在 他們的優先順序,從 到最低最高:

* DisplayMemberBinding 
* CellTemplate 
* CellTemplateSelector 

另請參閱C# Disciples post

+0

謝謝,這看起來確實像這個問題。我已經編輯我的代碼,但要使用SP1附帶的DataGrid控件。無論如何,這可能更適合我的情況。但這絕對是正確的解決方案。非常感謝! – Razzie 2009-02-26 07:54:43

0

我認爲問題是,你傳遞給FindResource()字符串不匹配您在XAML中定義的資源的關鍵。嘗試傳遞"NumberInStock",看看是否有效。

+0

夏普最簡單的辦法!不幸的是,這只是我身邊的一個複製粘貼編輯問題錯誤。它指向我的代碼中正確的鍵。而且,FindResource(string)在找不到密鑰時會引發異常。不管怎麼說,還是要謝謝你! – Razzie 2009-02-26 07:52:32

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 – 2014-09-11 15:19:22