问题描述
来自 WPFToolKit 的 CheckList 框。下面是 XAML 代码 (MainWindow.xaml)
<xctk:CheckListBox x:Name="SiteCheckList" Margin="0,512,0" Height="100" Width="150"
ItemsSource="{Binding SiteList}"
displayMemberPath="SiteName"
CheckedMemberPath="IsChecked">
</xctk:CheckListBox>
在模型类中添加了以下属性。我想将 Checked Items 从 CheckListBox 获取到我的字符串 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 方法来做到这一点?
解决方法
使用 IsChecked 布尔属性更新了模型类。
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
在下面的变量中得到了 CheckedItemsvar checkedSites = from site in SiteList
where (site.IsChecked == true)
select new { site.SiteName };
感谢大家回答我的问题并促使我思考更多。