从复选框的列表框中获取所选项目

时间:2015-10-02 10:32:21

标签: c# wpf checkbox data-binding listbox

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

上述代码有效。但是我还需要一种方法来获取所有勾选项目的最终设置(例如,按下按钮之后),以及那些我被困住的地方。当我勾选或取消勾选时,我会收到通知。

1 个答案:

答案 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;

修复此问题后(如果对IsCheckedSItem属性的绑定有效),您可以使用Linq表达式:

var checkedItems = SItemCollection.Where(item => item.IsChecked == true)