下面是生成按钮列表的标记。
<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>
使用过滤条件对按钮应用了筛选
collectionView = (CollectionView)CollectionViewSource.GetDefaultView(Items.ItemsSource);
collectionView .Filter = FilterList;
问题是我想在切换过滤器状态时保留按钮选中的状态。我已尝试订阅事件状态已更改
Items.ItemContainerGenerator.StatusChanged += new System.EventHandler(ItemContainerGenerator_StatusChanged);
但控件似乎不是在状态为"容器已生成"时生成的
void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
{
if (Items.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
RefreshButtons();
}
}
访问它们的唯一方法是使用可视化树。只需使用这样的东西:
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();
}
现在,将您的数据网格作为第一个参数传递,并将检查控件是否为所需控件的委托作为第二个参数传递。结果,您将获得找到的所有控制权