我有一个与ObservableCollection绑定的Accordion。我需要应用变通方法让Accordion将其子项调整为内容(即如果项目已从绑定集合中删除,我需要手风琴缩小,如果添加,则扩展)。
然而,我找到的所有解决方法都使用了AccordionItem对象。它们都在XAML中设置了AccordionItem项,因此它们的accordion.Items是AccordionItem对象的集合。
虽然我绑定到myObject,但它们被放置在ItemContainerStyleTemplate中的AccordionItem对象中。我唯一需要的是以某种方式访问AccordionItem。如果我尝试像accordion.Items [0] .GetType()那样返回myObject。
所以问题是 - 如何从数据绑定的Accordion访问AccordionItem对象?
我想尝试的解决方法:(编辑:它确实可以正常工作)
public static void UpdateSize(this AccordionItem item)
{
item.Dispatcher.BeginInvoke(
delegate
{
if (!item.IsLocked && item.IsSelected)
{
item.IsSelected = false;
item.InvokeOnLayoutUpdated(delegate { item.IsSelected = true; });
}
});
}
答案 0 :(得分:2)
我必须对Accordions做类似的事情,而我能够进入AccordionItems的唯一方法就是走在视觉树上。
我是这样做的:给定这些扩展方法:
public static IEnumerable<DependencyObject> GetAllChildrenOfType(this DependencyObject depObject, Type t, bool recursive = true)
{
List<DependencyObject> objList = new List<DependencyObject>();
var childrenList = depObject.GetChildren();
foreach (DependencyObject i in childrenList)
{
Type ct = i.GetType();
if (ct == t)
objList.Add(i);
if (recursive)
objList.AddRange(i.GetAllChildrenOfType(t));
}
return objList.ToArray();
}
public static IEnumerable<DependencyObject> GetChildren(this DependencyObject depObject)
{
int count = depObject.GetChildrenCount();
for (int i = 0; i < count; i++)
{
yield return VisualTreeHelper.GetChild(depObject, i);
}
}
现在你可以在给定的手风琴中获得所有的AccordionItem:
var accordionItemList = myAccordion.GetAllChildrenOfType(typeof(AccordionItem));
foreach (AccordionItem i in accordionItemList)
{...}
这可能比需要的要复杂一些,在我的手风琴中有手风琴,最终使事情变得困难。