C# 通过DataTemplate访问ItemsControl中生成的控件
下面是生成按钮列表的标记C# 通过DataTemplate访问ItemsControl中生成的控件,c#,wpf,itemscontrol,C#,Wpf,Itemscontrol,下面是生成按钮列表的标记 <ItemsControl x:Name="Items" Grid.Row="5" Grid.ColumnSpan="2"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <WrapPanel Orientation="Vertical"/> &
<ItemsControl x:Name="Items" Grid.Row="5" Grid.ColumnSpan="2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ToggleButton Content="{Binding Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
问题是,在切换过滤器状态时,我希望保留按钮选中的状态。我已尝试订阅活动状态更改
Items.ItemContainerGenerator.StatusChanged += new System.EventHandler(ItemContainerGenerator_StatusChanged);
但是控件似乎不会在状态为ContainerGenerated时生成
void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
{
if (Items.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
RefreshButtons();
}
}
访问它们的唯一方法是使用VisualTree。 用这样的方法:
public static T[] FindVisualChilds<T>(DependencyObject parent, Func<DependencyObject, bool> CompareDelegate)
where T : DependencyObject
{
if (VisualTreeHelper.GetChildrenCount(parent) == 0) return null;
List<T> childs = new List<T>();
if (CompareDelegate(parent))
childs.Add(parent as T);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var tmp = FindVisualChilds<T>(VisualTreeHelper.GetChild(parent, i), CompareDelegate);
if (tmp != null)
childs.AddRange(tmp);
}
return childs.ToArray();
}
public static T[]FindVisualChilds(DependencyObject父对象,Func CompareDelegate)
其中T:DependencyObject
{
if(VisualTreeHelper.GetChildrenCount(parent)==0)返回null;
List childs=新列表();
如果(比较继承人(父级))
添加(父项为T);
for(int i=0;i
现在,将datagrid作为第一个参数传递,并作为第二个委托传递,以检查控件是否为所需的控件。因此,您将获得找到的所有控件当触发事件ItemContainerGenerator_StatusChanged时,这不起作用。可视化树中没有控件。我是不是遗漏了什么?
public static T[] FindVisualChilds<T>(DependencyObject parent, Func<DependencyObject, bool> CompareDelegate)
where T : DependencyObject
{
if (VisualTreeHelper.GetChildrenCount(parent) == 0) return null;
List<T> childs = new List<T>();
if (CompareDelegate(parent))
childs.Add(parent as T);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var tmp = FindVisualChilds<T>(VisualTreeHelper.GetChild(parent, i), CompareDelegate);
if (tmp != null)
childs.AddRange(tmp);
}
return childs.ToArray();
}