Запретить выделение скрытых строк в DataGrid

261
30 марта 2017, 18:10

Используется DataGrid с возможностью множественного выбора. Некоторые строки скрываются через триггер:

<Style TargetType="DataGridRow">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Product.Id}" Value="0">
            <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Проблема в следующем.

К примеру в таблице 10 строк. Строки 2-9 скрыты. Я выбираю первую строку, зажимаю SHIFT и кликаю на последнюю строку. В итоге в свойство SelectedItems попадают все строки.

Хотелось бы сделать какой-то триггер на подобие этого, но нельзя использовать одно и тоже свойства в качестве триггера и сеттера:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsSelected" Value="True" />
        <Condition Property="Visibility" Value="Collapsed" />
    </MultiTrigger.Conditions>
    <Setter Property="IsSelected" Value="False" />
</MultiTrigger>

Как поправить такое поведение?

Answer 1

Можно подписаться на событие SelectionChanged, перебирать все строки, проверять их видимость и снимать выделение у скрытых строк.

Лучше пока ничего не придумал :)

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (object item in e.AddedItems)
    {
        int index = dataGrid.Items.IndexOf(item);
        DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row.Visibility != Visibility.Visible)
        {
            row.IsSelected = false;
        }
    }
}
READ ALSO
Как отделить строку от символов - C#

Как отделить строку от символов - C#

Вход: "first@secondcom" Выход: "second"

230
Реализация Undo/Redo

Реализация Undo/Redo

Доброго времени сутокНеобходимо последний нарисованный объект в Bitmap

200
Уничтожить Window после завершения потока

Уничтожить Window после завершения потока

Есть метод Something я его запускаю 100500 раз, однако объект SystemWindows

190
Заменить &ldquo;-&rdquo; на пробел

Заменить “-” на пробел

Чтобы перевести строку в hex код, нужно применить этот код:

189