1

有没有办法从 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?

如果还需要什么,请告诉我。

4

3 回答 3

2

如果您已直接绑定到一个 属性ObservableCollection<T>,您应该可以这样做:

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

如果不是这种情况,您需要发布相关的 XAML 和代码。

于 2012-07-16T15:08:15.640 回答
1

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

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

如果您只想要评论中建议的 Name 属性,则可以获取Bindingfor theItemsSourceProperty并查看该Path属性

var binding = soureContainer.GetBindingExpression(ListBox.ItemsSourceProperty);
var sourceCollectionName = binding.ParentBinding.Path.Path;
于 2012-07-16T16:20:31.243 回答
0

您与列表框关联的集合是 ObservableCollection?因为如果你设置了一个数组 - 它不会在后台将魔术转换为 ObservableCollection。

告诉你为什么需要这个逻辑。假设 smth 在其他逻辑中是错误的。

于 2012-07-16T15:11:58.400 回答