有没有办法从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?
如果还有其他需要,请告诉我。
答案 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在其他逻辑中是错误的。