C# 从带有复选框的列表框中获取所选项目

C# 从带有复选框的列表框中获取所选项目,c#,wpf,checkbox,data-binding,listbox,C#,Wpf,Checkbox,Data Binding,Listbox,A有一个带有复选框的列表框(我删除了与案例无关的关于对齐、宽度、边距的部分): A有一个站点集合(SItemCollection),它用项目填充我的列表框,其中一些项目被勾选。此集合位于SItem类之外,位于我的视图模型内。我还有一组应该在列表框中可用的所有项目(AvailableItems),以及一组应该在开始时选中的项目(ItemsToBetick)。这两个集合包含CachedStr类型的对象。通过使用这些集合,我可以获得我的SiteMcCollection: public Observab

A有一个带有复选框的列表框(我删除了与案例无关的关于对齐、宽度、边距的部分):

A有一个站点集合(SItemCollection),它用项目填充我的列表框,其中一些项目被勾选。此集合位于SItem类之外,位于我的视图模型内。我还有一组应该在列表框中可用的所有项目(AvailableItems),以及一组应该在开始时选中的项目(ItemsToBetick)。这两个集合包含CachedStr类型的对象。通过使用这些集合,我可以获得我的SiteMcCollection:

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;
        }
    }
public observeCollectionEx SItemCollection
{
得到
{
ObservableCollectionEx strItems=新的ObservableCollectionEx();
this.availableItems.ForEach(p=>
{
SItem item=newsitem();
项目。项目=p;
item.IsChecked=false;
增加(项目);
});
弗雷奇的strItems.ForEach(p=>
{
如果(此.ItemsToBeTicked.Contains(p.Item))
{
p、 IsChecked=true;
}
else p.IsChecked=false;
}
);
回程跨步;
}
}

上述代码有效。但我还需要一个方法,它将获得所有勾选项目的最终集(例如,按下按钮之后),这就是我被卡住的地方。当我勾选或取消勾选某个内容时,确实会收到通知。

代码当前在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;

马丁,我试过了,没用。我出于某种原因所做的更改不会影响收藏。例如,我在开始时勾选了4项。再勾选一些。当我尝试从集合中获取选中的项目时,我得到了相同的4个项目。但我每次勾选或取消勾选某个内容时都会收到通知,但来自站点M。对不起,我是新来的,在我完成思考之前输入并发送了评论:)对其进行了一些编辑。哦,我只是看到每次在
SItemCollection
属性中调用getter时,您都会创建一个新的集合实例。这会使您每次都回到原始状态。你必须改变这一点。
SItemCollection = CreateInitialCollection();
public ObservableCollectionEx<SItem> SItemCollection 
{
    get
    {
        return _sitemCollection;
    }
    set
    {
        if (_sitemCollection!= value)
        {
            _sitemCollection= value;
            RaisePropertyChanged("SItemCollection");
        }
    }
}
ObservableCollectionEx<SItem> _sitemCollection;
var checkedItems = SItemCollection.Where(item => item.IsChecked == true)