2013-04-05 72 views
1

各種項目類型,我展示兩種類型的項目中的ListView:顯示和編輯ListView中

abstract class Item 
{ 
    string ID { get; } 
} 

class ItemTypeA : Item 
{ 
    string Value { get; set; } 
} 

class ItemTypeB : Item 
{ 
    string ValueOne { get; set; } 
    string ValueTwo { get; set; } 
} 

(當然,還有更多給他們一點,他們使用不同的接口,但對於例如起見,我把它留了下來,只顯示了這些類型的「最終」結構)

所以基本上在ListView中,總是有一個ID列,其他列依賴於項目類型。

我想使用某種動態列ListView.View,其中底層視圖模型將確定GridView,這列(或屬性給定項目類型的)應該被顯示。

也是一樣的編輯 - 應該只有一個TextBoxItemTypeA和兩個用於ItemTypeB編輯區

所以基本上,我的問題是,如何解決這個問題,同時試圖避免爲每個項目類型製作完整的單獨視圖(帶有ListView和編輯區域)。

此外,我想避免直接在ListView中編輯項目,因爲項目值可能偶爾包含大量文本(甚至是多行文本),並且很難爲用戶編輯。

(我使用Caliburn.Micro,但這不應該與問題太相關)。

+1

你可以設置第二列的[ CellTemplateSelector(http://msdn.microsoft.com/en-us/library/system.windows.controls.gridviewcolumn.cell templateselector.aspx)添加到適當的[DataTemplateSelector](http://msdn.microsoft.com/zh-cn/library/system.windows.controls.datatemplateselector.aspx)。同樣,您可以爲編輯區域使用ContentPresenter和適當設置的[ContentTemplateSelector](http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter.contenttemplateselector.aspx)。 – Clemens 2013-04-05 21:38:36

+0

但我不想在ListView中顯示'ItemTypeB'作爲ValueOne和ValueTwo的複合值。當ItemTypeB項顯示在ListView中時,我需要兩個額外的列(ValueOne和ValueTwo),而只顯示一個額外的列(Value)。 – mnn 2013-04-05 22:02:51

+0

只是方向......我認爲你的虛擬機應該包含原始列表中的最大列數的屬性,並且列表屬性爲每個原始項目返回ienumerable,具有相應數量的屬性 – shibormot 2013-04-05 22:59:54

回答

0

您可以爲ListViewItem的提供自己的DataTemplateSelector:

public class MyTemplateSelector : DataTempolateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     // here select temaplate, from dictionary for example, using item.GetType() 
    } 
} 

你的項目視圖模型類:

abstract class Item 
{ 
    string ID { get; } 

    MyTemplateSelector TemplateSelector { get; } 
} 

你的ListViewItem的風格: