【问题标题】:How to Bind Checked / Selected Items From CheckListBox in WPF by using MVVM Model (I am using "WPFToolkit.Extended.dll" to get CheckListBox Control)如何使用 MVVM 模型从 WPF 中的 CheckListBox 中绑定选中/选定项(我正在使用“WPFToolkit.Extended.dll”来获取 CheckListBox 控件)
【发布时间】:2021-10-06 13:19:06
【问题描述】:

来自 WPFToolKit 的检查列表框。下面是 XAML 代码 (MainWindow.xaml)

<xctk:CheckListBox x:Name="SiteCheckList" Margin="0,0,512,0" Height="100" Width="150"
                               ItemsSource="{Binding SiteList}"
                               DisplayMemberPath="SiteName"
                               CheckedMemberPath="IsChecked">
            </xctk:CheckListBox>

在模型类中添加的以下属性。我想从 CheckListBox 中获取 Checked Items 到我的字符串 List (Model.cs)。 我将在项目逻辑中进一步使用这个字符串列表。

private string _SiteName;

        public string SiteName
        {
            get { return _SiteName; }
            set { _SiteName = value; }
        }

    private List<string> _SelectedSiteList;
            public List<string> SelectedSiteList
            {
                get { return _SelectedSiteList; }
                set
                {
                    _SelectedSiteList = value;
                }
            }

视图模型 (ViewModel.cs)

类 ViewModel : INotifyPropertyChanged {

    private ObservableCollection<Model> _SiteList;

    public ObservableCollection<DataModel> SiteList
    {
        get { return _SiteList; }
        set { _SiteList = value; }
    }

    public ViewModel()
    {
        SiteList = new ObservableCollection<Model>();
        PoppulateSiteNames();
    }


    private void PoppulateSiteNames()
    {
        Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
        keyValuePairs = Files.ReadIni_KeyValue("SiteSection");
        foreach (string Key in keyValuePairs.Keys)
        {
            keyValuePairs.TryGetValue(Key, out string LogTable);
            SiteList.Add(new Model() { SiteName = LogTable });
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string PropertyName)
    {
        if (PropertyChanged !=null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

}

在这里,我想从 UI 中获取选中/选定项目的列表。如果我不想在 MainWindow.cs 中编写任何代码,即 CheckedChanged 事件,那么我该如何使用 Binding 方法呢?

【问题讨论】:

  • 从CheckListBox的文档来看,所有选中的项都在SelectedItems集合中。如果您需要处理此列表,则将命令参数绑定到此属性。另外,如果collection元素有指定selected参数的属性,那么可以在SelectedMemberPath中指定。
  • 一旦复选框发生变化,我如何触发。即项目检查更改?简而言之,如何绑定 Command 属性?
  • 从哪里到哪里需要做什么?
  • 从您的解释来看,尚不清楚哪种方法、哪个命令应该获取此列表。也没有 DataModel 类型代码。它是否具有指示所选项目的属性?代码中显示的SiteList 集合属性也不会编译,因为_SiteList 字段的集合类型不同。完成您的问题并显示与该问题相关的 WORKING 代码。

标签: wpf mvvm binding checklistbox


【解决方案1】:

使用 IsChecked 布尔属性更新了 Model Class

private bool _IsChecked;

        public bool IsChecked
        {
            get { return _IsChecked; }
            set { _IsChecked = value; }
        }

然后 ViewModel 使用以下函数更新以填充 SiteList

 private void PoppulateSiteNames()
        {
            Dictionary<string, string> keyValuePairs = Files.ReadIni_KeyValue(Vars.MSSQL_Section);
            string [] Sites = keyValuePairs.Values.ToArray();
            for (int i = 0; i < Sites.Length; i++)
            {
                SiteList.Add(new HistoricalDataModel { SiteName = Sites[i] });
            }
        }

现在,我终于使用 LINQ

在下面的变量中得到了 CheckedItems
var checkedSites = from site in SiteList
                                where (site.IsChecked == true)
                                select new { site.SiteName };

感谢大家回答我的问题并促使我进行更多思考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多