Sari Rahal
Sari Rahal

Reputation: 1955

WPF Checklist Binding with ComboBox Select

I'm still new to WPF and Binding so please be as specific as possible. I am trying to build a list of objects to a ListBox of checkBoxes that I would like to bind with a Combobox. When the Combo box is selected, I would like the ListBox of checkBoxes to be refreshed. The ListBox loads perfectly on the first load but doesn't refresh when the list of objects change. I have debugged, and I can see that the Objects are changing it just the UI isn't being triggered. Any help would be nice, thank you ahead of time.

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 checkboxes

<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 Select Change

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 Classes

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

Upvotes: 1

Views: 143

Answers (1)

mm8
mm8

Reputation: 169190

The DocType class should implement the INotifyPropertyChanged interface and raise change notifications when the IsChecked property is set:

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

Then the CheckBox should be updated whenever you call the SetDocTypeIsChecked method.

Upvotes: 2

Related Questions