Геттеры в основном хороши для производных состояний: https://vuex.vuejs.org/guide/getters.html
Это также хорошая практика, чтобы поддерживать ваши геттеры в одном и том же состоянии. размещайте и используйте mapGetters в своих реактивных компонентах.
Это основано на чьем-то другом источнике, который я не могу вспомнить, но мы используем его, чтобы помочь найти визуальных детей тип. Возможно, это не самое эффективное использование для этого сценария, но оно может помочь вам встать на правильный путь.
public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
return null;
}
[Изменить 4.16.09] Исходя из этого, попробуйте этот метод. Должен найти все флажки и изменить состояние в соответствии с предоставлением, которое вызывается из вашего обработчика событий Checked / Unchecked.
public static void CheckAllBoxes(DependencyObject obj, bool isChecked)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
// If a checkbox, change IsChecked and continue.
if (obj is CheckBox)
{
((CheckBox) obj).IsChecked = isChecked;
continue;
}
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
CheckAllBoxes(child, isChecked);
}
}
Я бы использовал новые функции привязки данных в WPF. Присвойте всем флажкам одностороннюю привязку к их свойству IsChecked, а источником привязки будет свойство IsChecked главного флажка.
Еще одним вариантом будет использование триггеров
Это можно сделать декларативно. Следующее создает столбец флажков для каждой строки и может переключать выбор строк. Заголовок столбца флажка можно щелкнуть, чтобы выбрать все строки.
Соответствующие части из xaml
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit">
<toolkit:DataGrid Name="dataGrid"
ItemsSource="{Binding}" AutoGenerateColumns="True"
SelectionMode="Extended" CanResizeRows="False">
<toolkit:DataGrid.RowHeaderTemplate>
<DataTemplate>
<Grid>
<CheckBox IsChecked="{
Binding Path=IsSelected,
Mode=TwoWay,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type toolkit:DataGridRow}}}"
/>
</Grid>
</DataTemplate>
</toolkit:DataGrid.RowHeaderTemplate>
</toolkit:DataGrid>
</Window>
DataColumn dt = null;
for (int i = 0; i < dataGrid.Columns.Count; i++)
{
dt = new DataColumn("Column Name");
dt.DataType = typeof(Boolean);
dt.DefaultValue = false;
dataTable.Add(dt);
}
dataGied.DataContext = dataTable;
<Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="{Binding}" />
Ну, это всего лишь грубая идея, надеюсь, это сработает