2016-03-29 18 views
0

Bir wpf C# uygulamasına sahibim.Gözatıcalık kutusunun Gözlemlenebilir Bir Veritabanına Bağlanması

Bir açılan kutu kullanıyorum ve itemsource özelliğini gözlemlenebilir bir koleksiyona ayarladım.

Sahip olduğum sorun şu ki, bu koleksiyonu değiştirdiğimde değişiklikler benim açılmamamda yansıtılmıyor.

Yani neyi yanlış yaptığımı merak ediyorum?

ActiveState.JobsActive = new ObservableCollection<JobTicker>('data from a list'); 
toplama değişkenin benim beyanı

:

public static ObservableCollection<JobTicker> JobsActive = new ObservableCollection<JobTicker>(); 

My açılan Kutusu (I koleksiyonuma bağlanan

public class JobTicker 
{ 
    public string CustomerRef { get; set; } 
    public string JobRef { get; set; } 
    public int JobId { get; set; } 
    public string CustomerJobDetails { get; set; } 
    public string CustomerName { get; set; } 
} 

:

Bu benim sınıf nesnesidir benim app başlatıldığında yüklü olan bir userControl On)

geride
<xctk:WatermarkComboBox x:Name="cboActiveJobs" Grid.Row="1" Grid.Column="2" 
    Width="250" Watermark="Select Customer"   
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"      
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed" 
    Style="{StaticResource ComboBoxFlatStyle}" 
    /> 
ve benim kod: Ben değiştirirseniz

cboActiveJobs.ItemsSource = ActiveState.JobsActive; 

Şimdi 'ActiveState.JobsActive' ı değişikliklerin benim açılan yansıtılması beklenir ama değiller.

cevap

2

Sahip olduğunuz kod aslında bağlayıcı değildir. Sadece bir mülke bir koleksiyon tahsis ediyor.

Birleşik kutunun ItemsSource özelliği, ObservableCollection'dan bildirimleri dinleyemiyor. Bunun yerine, bu bildirimleri dinlemek ve UI güncellemelerini gerçekleştirmek için Binding sınıfının bir örneğine ihtiyacınız vardır. Binding, tüm sihrin olduğu yerdir. Sen XAML bağlamak için en kolay ve olduğu kadar en yaygın arada kodda programlı bir tane oluşturun ve (aşağıdaki bağlantılara bakın) ekleyin, ancak olabilir:

<xctk:WatermarkComboBox 

    ItemsSource="{Binding JobsActive}" 

    SelectedItem="{Binding SelectedCustomer}" 

    x:Name="cboActiveJobs" 
    Grid.Row="1" 
    Grid.Column="2" 
    Width="250" 
    Watermark="Select Customer"   
    DisplayMemberPath="CustomerJobDetails" 
    HorizontalContentAlignment="Center"      
    SelectionChanged="cbo_SelectionChanged" 
    DropDownOpened="cbo_DropDownOpened" 
    DropDownClosed="cbo_DropDownClosed" 
    Style="{StaticResource ComboBoxFlatStyle}" 
    /> 

Şimdi JobsActive bir görüş kamu malı olmalıdır Bu kontrol için DataContext modelini kullanın. Eğer değilse, bu işe yaramaz.

Bir SelectionChanged olayına sahip olduğunuzdan, görünüm modelinizde de bir özellik olacak bir SelectedCustomer bağlayıcı ekledim. Binding, bu iki yolu da güncelleyecektir: Bunu, görünüm modelinizde değiştirin ve açılan kutunun seçimi değişecektir. Kullanıcı bir combobox öğesini seçtiğinde, viewmodel özellik değeri değişecektir.

private JobTicker _selectedCustomer; 
public JobTicker SelectedCustomer { 
    get { return _selectedCustomer; } 
    set { 
     _selectedCustomer = value; 
     // If you're not in C#6, use this instead: 
     //OnPropertyChanged("SelectedCustomer"); 
     OnPropertyChanged(nameof(SelectedCustomer)); 
    } 
} 

// Implement INotifyPropertyChanged 
public event PropertyChangedEventHandler PropertyChanged; 
protected void OnPropertyChanged(string propName) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propName)); 
    } 
} 

bu bağlayıcı hemen bir ViewModel yazmadan çalışan, ben bu yaklaşımı önermiyoruz almak istiyorsunuz, ama kesinlikle yapılabilir ise

. StackOverflow üzerinde bu çalışmayı elde etmenize yardımcı olacak birkaç cevap vardır: WPF Binding Programatically, How to programmatically set data binding using C# xaml.

+0

bu çok açıklayacaktır. Teşekkür ederim :) –

+0

Bir VM uygulamak için bakmak zorundayım. Gördüğünüzde bu benim için biliyor. –

+0

@AndrewSimpson Ah, evet. WPF'nin çoğu, görünüm modelinden özellikleri birleştirmeye başladığınızda çok daha anlamlı olacaktır. Çok fazla değil: [INotifyPropertyChanged] uygulamasını uygulayın (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged (v = vs.110).aspx) ve yangın bildirimleri uygun şekilde. Kullanıcı Arabirimi tarafından tüketilecek koleksiyonlar için, zaten kullanmakta olduğunuz ObservableCollection jenerikini kullanın. –

İlgili konular