2017-10-19 4 views
1

Ich bin noch neu in WPF und Binding also bitte so genau wie möglich sein. Ich versuche, eine Liste von Objekten zu einer ListBox von CheckBoxen zu erstellen, die ich mit einer Combobox binden möchte. Wenn das Kombinationsfeld ausgewählt ist, möchte ich die ListBox der CheckBoxes aktualisiert werden. Die ListBox lädt beim ersten Laden einwandfrei, aktualisiert sich jedoch nicht, wenn sich die Liste der Objekte ändert. Ich habe debugged, und ich kann sehen, dass die Objekte es ändern, nur die Benutzeroberfläche wird nicht ausgelöst. Jede Hilfe wäre nett, danke im Voraus der Zeit.WPF Checkliste Bindung mit ComboBox Wählen

ComboBox

<ComboBox Grid.Column="0" SelectionChanged="JobTypeComboBox_SelectionChanged" 
           Name="JobTypeComboBox" 
           ItemsSource="{Binding Path=AllJobTypes}" 
           DisplayMemberPath="Name" 
           SelectedValuePath="Name" 
           SelectedValue="{Binding Path=JobConfig.SelectedJobType.Name}" /> 

ListBox Ankreuzfelder

<ListBox ItemsSource="{Binding AllDocTypes}" Height="177" Name="listTopics" VerticalAlignment="Top"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}" Checked="DocTypeCheckBox_Checked" Unchecked="DocTypeCheckBox_UnChecked"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Constructor

public ConfigControl() { 
    InitializeComponent(); 
    this.DataContext = this; 
    LoadSettings(); 
} 

Attributes

// Create the OnPropertyChanged method to raise the event 
protected void OnPropertyChanged(string name) { 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
} 

public JobConfiguration JobConfig { 
    get { return _jobConfig; } 
    set { 
     _jobConfig = value; 
     // Call OnPropertyChanged whenever the property is updated 
     OnPropertyChanged("JobConfig"); 
    } 
} 

public DocTypeList AllDocTypes { 
    get { return _allDocTypes; } 
    set { 
     _allDocTypes = value; 
     OnPropertyChanged("AllDocTypes"); 
    } 
} 

ComboBox ändern auswählen

private void JobTypeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    //set the new jobtype selected 
    //load settings for that job type 
    ComboBox cmb = sender as ComboBox; 
    JobType selectedJob = (JobType)cmb.SelectedItem; 
    JobConfig.SelectedJobType = selectedJob; 
    AllDocTypes.SetDocTypeIsChecked(JobConfig.SelectedJobType.DocTypes); 
    OnPropertyChanged("JobConfig"); 
    OnPropertyChanged("AllDocTypes"); 
} 

DocType Klassen

using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Serialization; 

namespace ISO_Validation_And_Processing.Models { 

public class DocType { 
    [XmlElement] 
    public string Name { get; set; } 

    [XmlIgnore] 
    public bool IsChecked { get; set; } = false; 
} 

public class DocTypeList : List<DocType> { 
    public static DocTypeList Read(ISerializeManager serializeManager) { 
     if (serializeManager != null) { 
      return serializeManager.ReadObject<DocTypeList>(); 
     } else { 
      return null; 
     } 
    } 

    public DocTypeList() { } 

    public void SetDocTypeIsChecked(DocTypeList selectedDocs) { 
     foreach (var docType in this) { 
      docType.IsChecked = IsDocTypeSelected(docType, selectedDocs); 
     } 
    } 

    public bool IsDocTypeSelected(DocType docType, DocTypeList selectedDocs) { 
     //if there is a doctype with the same name return true 
     return selectedDocs.Where(t => t.Name == docType.Name).ToList().Count > 0; 
    } 
} 
} 
+0

Wie und wo werden AllDocTypes "aktualisiert"? – mm8

+0

Ist 'AllDocTypes' eine ObservableCollection <>? – MisterMystery

+0

Sorry hinzugefügt den Konstruktor –

Antwort

2

Die DocType Klasse sollte die INotifyPropertyChanged-Schnittstelle implementieren und Änderungsbenachrichtigungen erhöhen, wenn die IsChecked Eigenschaft festgelegt ist:

public class DocType : INotifyPropertyChanged 
{ 
    [XmlElement] 
    public string Name { get; set; } 

    private bool _isChecked; 
    [XmlElement] 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set 
     { 
      _isChecked = value; 
      OnPropertyChanged("IsChecked"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Dann wird die CheckBox sollte aktualisiert werden, wenn Sie dieanrufenMethode.

+0

Könnten Sie diese Antwort umgestalten, um meine 2 Klassen zu verwenden, damit ich besser verstehen, um zu implementieren? –

+1

Sie müssen Ihre DocType-Klasse gemäß meiner bearbeiteten Antwort erneut implementieren. – mm8

+1

Ich wünschte, ich könnte das mehr als einmal verbessern! –