2010-10-26 102 views
5

大家好
我有一個數據綁定到元素列表的組合框。但除了這些元素列表之外,我還想要另一個項目。此項目應顯示文本'新...'
這個想法是,如果他們選擇一個正常的元素,它會執行一些涉及該元素的操作。如果他們選擇'新'元素,它會把他們帶到一個屏幕上,他們可以創建一個新的項目。
問題是,當你的東西進行數據綁定您沒得到另一個項目添加到它的選項,並沒有添加僞項元素列表的問題...Databound WPF組合框與'新...'項目

這是一個機會,創造基於具有'DefaultElement'屬性的ComboBox的新控件? (與所有相關聯的模板和命令綁定等)

回答

5

爲此,我以前爲普通類型創建了一個虛擬包裝類,允許您綁定到一個包含大部分正確值的列表以及「新建」。 ..「一個,例如

public class DisplayClass 
{ 
    public DisplayClass(ModelClass mc) 
    { 
     this.mc = mc; 
    } 

    public string Name 
    { 
     get { return this.mc != null ? this.mc.Name : "New..."; } 
    } 

    public bool IsDummy 
    { 
     return this.mc == null; 
    } 

    public ModelClass Model 
    { 
     return this.mc; 
    } 
} 

然後,您可以承載的這些集合中的數據上下文(視圖模型),並妥善處理基於IsDummy選擇。它不像內置此功能的控件那麼自動,但非常簡單,可能很容易使其變得通用並且可重用。

+0

這似乎符合我的標準......它的困難,因爲你和VC的回答基本上是相同的,但我會立即採取這因爲它有一個例子 – TerrorAustralis 2010-10-26 10:10:38

+0

不用擔心,很高興看到你找到了答案 – 2010-10-26 13:13:16

2

請記住,您綁定的是面向UI的項目集合,這些項目可能與業務或數據實體不同。

如果我是你,我會在綁定集合的第一個位置插入一個'new'實體,並在我的viewmodel中檢測它以在用戶選擇它時觸發相應的操作。

3

將ItemsSource屬性設置爲具有新項目的CompositeCollection並將集合綁定在一起,然後根據所選索引或類似內容檢測該項目的選擇。

示例代碼:

<ComboBox> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
     <ComboBoxItem>Add New Item...</ComboBoxItem> 
     <CollectionContainer Collection="{Binding Source={StaticResource CollectionSource}}"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

MSDN爲CompositeCollection:http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection(v=vs.110).aspx

+0

很好的答案。謝謝。 – 2014-04-08 11:36:50