2015-08-05 25 views
5

C# kodlamada profesyonel değil, WPF programlamasında yeniyim.WPF Sınıflandırılmış sözlüğe bağlama

Yani şu sorunum var: Çok fazla farklı combobox ve textbox var. Onları arka planda bir değişkene bağlamak istiyorum çünkü bir Veritabanından Veri ile açılan kutuları doldurmak istiyorum. Ben liste.xaml yüklediğinizde

private Dictionary<string, Filter> _ctrlFilter; 

public Dictionary<string, Filter> ctrlFilter { 
    get { return _ctrlFilter; } 
    set { _ctrlFilter = value; } 
} 

aşağıdaki kodla ctrlFilter Sözlük başlatır:

yüzden
liste.xaml.cs dosyasında aşağıdaki yarattı
ctrlFilter = new Dictionary<string, Filter> 
{ 
    //ComboBox 
    {"hersteller", new Filter("Hersteller", typeof(ComboBox)) }, 
    {"fahrzeugart", new Filter("Fahrzeugart", typeof(ComboBox), false) }, 

    //TextBox 
    {"baujahr", new Filter("Baujahr", typeof(TextBox), true, typeof(short)) }, 
    {"anschaffungswert", new Filter("Anschaffungswert", typeof(TextBox), true, typeof(decimal)) }, 
    {"finanz_restwert", new Filter("Restwert", typeof(TextBox), true, typeof(decimal)) }, 

    //Others 
    {"zugelassen", new Filter("Zugelassen", typeof(DatePicker), true, typeof(DateTime)) }, 
    {"vstabzug", new Filter("Vorsteuerabzug", typeof(CheckBox), true, typeof(bool)) }, 
}; 

Bu nedenle filtre sınıfı (liste.xaml.cs modelinde de bulunmaktadır) şöyle görünür:

public class Filter 
{ 
    public string FilterName; 
    public Type ControlType; 
    public Type FromToType; 
    public bool Load; 
    public ObservableCollection<object> Items; 
    public object SelectedFilter; 
    public object From; 
    public object To; 

    public Filter(string name, Type type, bool load = true, Type ftType = null) 
    { 
     Reset(); 
     FilterName = name; 
     ControlType = type; 
     Load = load; 
     FromToType = ftType; 
    } 

    public void Reset() 
    { 
     From = null; 
     To = null; 
     SelectedFilter = null; 
     Items = new ObservableCollection<object>(); 
    } 
} 

Şimdi, diğer xaml dosyalarını dinamik olarak liste.xaml dosyasına yüklüyorum. Örneğin Fahrzeug_Allgemein.xaml Orada

Şöyle ki, comboboxes var:

  <StackPanel> 
       <Label Content="Hersteller:" Target="{Binding ElementName=cmb_hersteller, Mode=OneWay}"/> 
       <ComboBox x:Name="cmb_hersteller" Fahrzeuge:FilterExtension.FilterName="hersteller" Width="120" ItemsSource="{Binding ctrlFilter[hersteller].Items}" SelectedIndex="0" SelectionChanged="cmb_hersteller_SelectionChanged"/> 
      </StackPanel> 

Sen Filtre sınıfından Öğeler özelliği almaya çalıştı görüyoruz, ancak yok iş. Visual Studio 2015 çıktısında şöyle der:

System.Windows.Data Error: 40 : BindingExpression path error: 'Items' property not found on 'object' ''Filter' (HashCode=44888241)'. BindingExpression:Path=ctrlFilter[hersteller].Items; DataItem='liste' (Name=''); target element is 'ComboBox' (Name='cmb_hersteller'); target property is 'ItemsSource' (type 'IEnumerable') 

Ben zaten bir şey hakkında INotifyPropertyChanged okumak ama benim durumumda nasıl kullanılacağını bilmiyorum. Bana yardım edebilecek olursanız çok iyi olur.

Teşekkür ederiz.

+1

Bir sözlüğe bağlanıyorsunuz ... Belki bu size yardımcı olacaktır: http://stackoverflow.com/questions/3334128/binding-a-dictionarys-key-and-value-in-a-listbox- with-wpf – derape

cevap

1

Cevabın bu kadar basit olduğunu düşünmemiştim. Öğeler özelliğine yalnızca { get; set; } eklemem gerekiyordu.

Yani kod artık şuna benzer:

public class Filter 
{ 
    public string FilterName; 
    public Type ControlType; 
    public Type FromToType; 
    public bool Load; 
    public ObservableCollection<ComboBoxItem> Items { get; set; } 
    ... 

Ben Öğeler özellik bu eklenmesiyle sadece bağlamak mümkün olduğunu, bunun anlamı düşünüyorum.

+1

Kesin olmak için, get/set'i eklemeden önce, bu sadece bir alan, özellik değil. – WasGoodDone

1

Sadece bunu yorumlamak için çok düşük bir geri dönüşüme sahibim, ancak henüz yapmadıysanız read up on properties in c# ve data binding'u kullanmalısınız. Bu bağlantıları ve içerdikleri ekstra bağlantıları okudum ve anlamımı önemli ölçüde artırdı.