如何使用 MVVM 模型从 WPF 中的 CheckListBox 绑定选中/选定的项目(我正在使用 "WPFToolkit.Extended.dll" 获取 CheckListBox 控件)
How to Bind Checked / Selected Items From CheckListBox in WPF by using MVVM Model (I am using "WPFToolkit.Extended.dll" to get CheckListBox Control)
来自 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>
模型中添加了以下属性 Class。我想从 CheckListBox 中获取选中的项目到我的字符串列表 (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;
}
}
查看模型(查看Model.cs)
class 视图模型: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 方法来实现?
使用 IsChecked 布尔值 属性.
更新了 模型 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 };
感谢大家回答我的问题并促使我思考更多。
来自 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>
模型中添加了以下属性 Class。我想从 CheckListBox 中获取选中的项目到我的字符串列表 (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;
}
}
查看模型(查看Model.cs)
class 视图模型: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 方法来实现?
使用 IsChecked 布尔值 属性.
更新了 模型 Classprivate 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
得到了 CheckedItemsvar checkedSites = from site in SiteList
where (site.IsChecked == true)
select new { site.SiteName };
感谢大家回答我的问题并促使我思考更多。