Reputation: 1955
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
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