2010-10-26 29 views
5

Herkese selam
Bir öğeler listesi için bir databound olan bir combobox var. Ama bu elemanlar listesine ek olarak, başka bir öğeye sahip olmak istiyorum. Bu öğe 'Yeni ...' metnini görüntülemelidir '
Fikir, normal elemanlardan birini seçerse, o unsuru içeren bazı eylemleri gerçekleştirir. 'Yeni' öğesini seçerlerse, yeni bir öğe oluşturabilecekleri bir ekrana götürürler.
Bir şey databind zaman sorun, ona başka bir öğe ekleme seçeneği do not get ve elementlerin listesine bir kukla öğe ekleyerek söz konusu değildir ... Databound WPF ComboBox 'Yeni ...' ile

bu oluşturmak için bir fırsattır mı 'DefaultElement' özelliğine sahip ComboBox'a dayalı yeni bir kontrol? (tüm ilişkili şablon oluşturma ve komut bağlama vb.)

cevap

5

Bunu yapmak için, daha önce normal değerler için bir kukla sarmalayıcı sınıfı oluşturdum ve çoğunlukla doğru değerleri içeren bir listeye ve "Yeni. .. "bir, örneğin

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; 
    } 
} 

Ardından veri bağlamında (ViewModel) bu koleksiyonu barındırabilir ve uygun IsDummy dayalı seçim işleyebilir. Bu işleve sahip bir kontrol olarak otomatik değil, ama oldukça basit ve muhtemelen kolayca jenerik ve yeniden kullanılabilir hale getirilebilir.

+0

Bu senin ve VC cevapları temelde aynı olduğundan ... Onun zor benim kriterleri yerine getirme gibi görünüyor, ama bir kez bu alacağım bir örnek olduğu için – TerrorAustralis

+0

Endişeye gerek yok, bir cevap bulduğuna sevindim sevindim –

2

Bağladığınız şeyin, iş veya veri varlıklarından farklı olabilecek kullanıcı arabirimi odaklı öğelerden oluşan bir koleksiyon olduğunu unutmayın.

Yerinde olsaydım, bağlı koleksiyonun ilk konumuna bir 'yeni' varlık eklerim ve onu seçtiğinde uygun eylemi tetiklemek için onu viewmodelimde algılardım.

3

ItemsSource özelliğini, yeni öğe ve ciltli toplama ile birlikte CompositeCollection'a ayarlayın, sonra o öğenin seçimini, seçilen dizine veya benzer bir öğeye göre algılayın.

Örnek Kod: CompositeCollection için

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

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

+0

Harika cevap. Teşekkürler. –