Щелчок по строке сетки данных Silverlight
-
05-07-2019 - |
Вопрос
У меня есть datagrid со столбцом, содержащим флажок.Я хочу изменить значение связанного выбранного свойства при щелчке по строке:
ПРИМЕЧАНИЕ:Я не хочу использовать событие SelectedItemChanged, потому что это не работает должным образом, когда в сетке есть только одна строка.
Решение
Как часто я нашел свое собственное решение для этого:
Добавьте событие MouseLeftButtonUp в сетку данных:
<data:DataGrid x:Name="dgTaskLinks"
ItemsSource="{Binding TaskLinks}"
SelectedItem="{Binding SelectedTaskLink, Mode=TwoWay}"
MouseLeftButtonUp="dgTaskLinks_MouseLeftButtonUp"
>...
И пройдитесь по визуальному дереву , чтобы получить строку сетки данных:
private void dgTaskLinks_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
///get the clicked row
DataGridRow row = MyDependencyObjectHelper.FindParentOfType<DataGridRow>(e.OriginalSource as DependencyObject);
///get the data object of the row
if (row != null && row.DataContext is TaskLink)
{
///toggle the IsSelected value
(row.DataContext as TaskLink).IsSelected = !(row.DataContext as TaskLink).IsSelected;
}
}
Обнаружив, это простой способ переключить привязанное свойство IsSelected: -)
Надеюсь, это поможет кому-то еще.
Другие советы
Вот еще более простое решение
XAML
<data:DataGrid
x:Name="dgMyDataGrid"
ItemsSource="{Binding MyList}"
SelectedItem="{Binding MyList, Mode=TwoWay}"
MouseLeftButtonUp="dgMyDataGrid_MouseLeftButtonUp">...
CS
private void dgMyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
DataGrid dg = (sender as DataGrid);
var allObjects = dg.DataContext as List<MyCustomObject>;
foreach(var o in allObjects)
{
o.Selected = false;
}
MyCustomObject SelectedObject = (MyCustomObject)dg.SelectedItem;
SelectedObject.Selected = true;
}
Примечание:в этом, а также в другом примере предполагается, что ваш класс, который вы привязываете к элементу управления, реализует INotifyPropertyChanged