У меня есть DataGrid, который является RowDetails, установлен показать при выборе (RowDetailsVisibilityMode = "VisibleWhenSelected"). Теперь я хочу смочь избавиться от него! Я поместил близкую кнопку на детали строки с этим кодом:
private void Button_Click(object sender, RoutedEventArgs e)
{
e.Handled = true;
Button button = sender as Button;
DataGridRow row = button.FindAncestor<DataGridRow>();
row.DetailsVisibility = Visibility.Collapsed;
}
Тот код получает меня 90% там, но после того как строка детализирует, сворачивается для данной строки, это не появится в следующий раз, когда строка выбрана.
Я тоже с этим столкнулся. Вот решение:
Оставьте эту кнопку в RowDetails и немного измените ее код. Вместо того чтобы фокусироваться на видимости отдельного ряда, установите свойство SelectedIndex в DataGrid равным -1 (нет выбранных).
DataGrid1.SelectedIndex = -1;
Поскольку ваш RowDetailsVisibilityMode - VisibleWhenSelected
, DataGrid свернет/скроет все развернутые RowDetails. Это хорошо работает, когда режим SelectionMode - Single
.
попробуйте добавить row.DetailsVisibility = Visibility.Visible;
в событие RowDetailsVisibilityChanged
.
Попробуйте установить стиль на кнопку с сеттерами, которые устанавливают свойства Command, CommandParameter кнопки. Вам нужно будет создать класс, который дополняет ICommand, и включить его как StaticResource в XAML. Здесь я использовал DataGridRowHeader в качестве кнопки вместо кнопки в деталях строки.
<local:DeselectRowCommand x:Key='deselectCommand' />
<Setter Property='Command' Value='{StaticResource deselectCommand}' />
<Setter Property='CommandParameter'
Value='{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=wpf:DataGridRow}}' />
В методе Execute команды вы можете получить DataGridRow из параметра команды и применить любые методы, которые вам нужны.
По крайней мере, таким образом вы можете поделиться этим стилем или создать на его основе другие и повторно использовать ICommand для других DataGrid, а также меньше обрабатывать события.
Вы можете увидеть рабочий пример в этом проекте Silverlight-to-WPF DataGrid с открытым исходным кодом.