从ListBox获取ObservableCollection

时间:2012-07-16 15:01:57

标签: c# wpf data-binding listbox observablecollection

有没有办法从ListBox以编程方式确定关联的ObservableCollection?

我将ItemsSource绑定到我的XAML中的ListBox,当用户从中选择一个项目时,我希望程序不仅找到该项目来自哪个ListBox(我已经设法做到)而且还得到了与之相关的ObservableCollection。

我认为通过使用sourceContainer.ItemsSource.ToString()(其中sourceContainer是以编程方式找到的ListBox),我将能够确定它背后的DataBound ObservableCollection。但事实并非如此。我错过了什么?

谢谢!

编辑:这里有一些与ObservableCollections的创建有关的代码,以及我如何确定选择了哪个框。 (我知道这可能不是最好的方式,我还在学习......)

首先,XAML(每个ListBox都有这行用于常规绑定):

ItemsSource="{Binding Path=ListOneItems}"

现在创建ObservableCollections的代码:

    private ObservableCollection<DataItem> listOneItems;

    public ObservableCollection<DataItem> ListOneItems
    {
        get
        {
            if (listOneItems == null)
            {
                listOneItems = new ObservableCollection<DataItem>();
            }
            return listOneItems;
        }
    }

这是程序确定所选项目的父项的地方:

//Finds the name of the container that holds the selected SLBI (similar to finding the initial touched object)
FrameworkElement determineSource = e.OriginalSource as FrameworkElement;
SurfaceListBox sourceContainer = null;

while (sourceContainer == null && determineSource != null)
{
    if ((sourceContainer = determineSource as SurfaceListBox) == null)
    {
        determineSource = VisualTreeHelper.GetParent(determineSource) as FrameworkElement;
    }
}

//Name of the parent container
strParentContainer = sourceContainer.Name;

//Name of the ObservableCollection associated with parent container?

如果还有其他需要,请告诉我。

3 个答案:

答案 0 :(得分:2)

如果您直接绑定到ObservableCollection<T>的媒体资源,您应该可以这样做:

var col = (ObservableCollection<MyClass>)sourceContainer.ItemsSource;

如果情况并非如此,则需要发布相关的XAML和代码。

答案 1 :(得分:1)

Eren's answer是正确的,您可以通过将ItemsSource属性强制转换为正确的集合类型来获取实际集合。

ObservableCollection<DataItem> sourceCollection = 
    sourceContainer.ItemsSource as ObservableCollection<DataItem>;

如果您只想要评论中建议的Name属性,则可以获取Binding的{​​{1}}并查看ItemsSourceProperty属性

Path

答案 2 :(得分:0)

与列表框关联的集合是ObservableCollection? Cuz如果你设置一个数组 - 它不会在后台进行神奇的转换为ObservableCollection。

告诉您需要这个逻辑的内容。假设smth在其他逻辑中是错误的。