A有一个带复选框的列表框(我删除了关于对齐的部分,宽度,边距与案例无关):
<ListBox
ItemsSource ="{Binding SItemCollection}"
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Path=Item.Code}" IsChecked="{Binding IsChecked}"/>
</DataTemplate>
</ListBox.ItemTemplate>
我的ViewModel中有一个类SItem,它存储两个字段 - 我从Cache获取的CachedStr和一个布尔IsChecked,它表示是否检查了项目(CachedStr对象也有几个字段(Name,Code等),我已选择展示代码):
public class SItem : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public CachedStr Item { get; set; }
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
NotifyPropertyChanged("IsChecked");
}
}
protected void NotifyPropertyChanged(string strPropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
}
A有一个SItems集合(SItemCollection),它用我的ListBox填充项目,其中一些项目被勾选。这个集合在SItem类之外,它在我的视图模型中。我还有一组应该在ListBox中可用的所有项(AvailableSItems)和一组应该在一开始就检查的项(ItemsToBeTicked)。这两个包含CachedStr类型的对象。通过使用这些集合,我得到了我的SItemCollection:
public ObservableCollectionEx<SItem> SItemCollection
{
get
{
ObservableCollectionEx<SItem> strItems = new ObservableCollectionEx<SItem>();
this.AvailableSItems.ForEach(p =>
{
SItem item = new SItem();
item.Item = p;
item.IsChecked = false;
strItems.Add(item);
});
strItems.ForEach(p =>
{
if (this.ItemsToBeTicked.Contains(p.Item))
{
p.IsChecked = true;
}
else p.IsChecked = false;
}
);
return strItems;
}
}
上述代码有效。但是我还需要一种方法来获取所有勾选项目的最终设置(例如,按下按钮之后),以及那些我被困住的地方。当我勾选或取消勾选时,我会收到通知。
答案 0 :(得分:1)
代码当前在get块中创建了一个新的集合实例。必须更改此项,否则每次调用get块时,UI中所做的更改都将被还原。
获取当前在get块中的代码,将其解压缩到方法并使用方法的返回值来设置SItemCollection
属性。
在构造函数中,例如:
SItemCollection = CreateInitialCollection();
该物业将简化为:
public ObservableCollectionEx<SItem> SItemCollection
{
get
{
return _sitemCollection;
}
set
{
if (_sitemCollection!= value)
{
_sitemCollection= value;
RaisePropertyChanged("SItemCollection");
}
}
}
ObservableCollectionEx<SItem> _sitemCollection;
修复此问题后(如果对IsChecked
中SItem
属性的绑定有效),您可以使用Linq表达式:
var checkedItems = SItemCollection.Where(item => item.IsChecked == true)