WPF Checklist与ComboBox绑定选择

时间:2017-10-19 14:11:14

标签: c# wpf combobox listbox

我还是WPF和Binding的新手,所以请尽可能具体。我正在尝试构建一个对象列表,其中包含我想要与Combobox绑定的checkBoxes的ListBox。选择组合框后,我希望刷新checkBoxes的ListBox。 ListBox在第一次加载时完美加载,但在对象列表更改时不刷新。我已经调试了,我可以看到对象正在改变它只是UI没有被触发。任何帮助都会很好,谢谢你提前。

组合框

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

ListBox复选框

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

构造

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

属性

// 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选择更改

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类

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

1 个答案:

答案 0 :(得分:2)

DocType类应实现INotifyPropertyChanged接口,并在设置IsChecked属性时引发更改通知:

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

每当您调用CheckBox方法时,都应更新SetDocTypeIsChecked