2015-07-15 2 views
1

У меня есть datagrid, который перечисляет статус пары вещей и отображает либо «True», либо «False». Когда я дважды нажимаю на ячейку, я хочу переключить отображение этой ячейки. Я попытался использовать ряд свойств для моего datagrid, таких как currentItem, SelectedItem, SelectedValue и SelectedUnit, но ни один из них не сработал.Как изменить значение отдельной ячейки в файле данных WPF при двойном щелчке?

<DataGrid x:Name="dataGrid1" IsReadOnly="True" IsManipulationEnabled="False" Width="250" Height="468" Margin="795,15,18,15" 
      VerticalAlignment="Top" AutoGenerateColumns="False" CanUserAddRows="False" MouseDoubleClick="DoubleClick" 
      ItemsSource="{Binding Availability}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Number" Binding="{Binding Key, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/> 
     <DataGridTextColumn Header="Status1" Binding="{Binding Value1, UpdateSourceTrigger=PropertyChanged}" Width="Auto"/> 
     <DataGridTextColumn Header="Status2" Binding="{Binding Value2, UpdateSourceTrigger=PropertyChanged}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 

Вот событие в моей коде:

private void DoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (dataGrid1.SelectedItem == null) return; 

    if (dataGrid1.CurrentItem == "True") 
    { 
     dataGrid1.CurrentItem = "False"; 
    } 
    else if (dataGrid1.CurrentItem == "False") 
    { 
     dataGrid1.CurrentItem = "True"; 
    } 
} 
+1

Ваш DataGrid привязан к источнику данных, поэтому вам необходимо будет обновить этот источник данных, а затем перезагрузить данные. – jp2code

+0

Я знаю, как определить, какую строку нажать, используя dataGrid1.SelectedIndex, но как определить, какой столбец нажат? Например, если я дважды кликнул на произвольную строку в среднем столбце, связанную с Value1. Как сообщить моему источнику данных, что ему нужно переключать Value1, а не Value2? – reubonwry

+0

Казалось бы, мне нужно что-то вроде dataGrid1.SelectedColumn, но я не вижу этого свойства, указанного на веб-сайте msdn. – reubonwry

ответ

2

Если вы хотите знать, какой DataGridCell в настоящее время двойным щелчком, вы должны добавить к вашей XAML:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <EventSetter Event="MouseDoubleClick" Handler="dataGrid1_CellDoubleClick" /> 
    </Style> 
</DataGrid.CellStyle> 

А потом в коде, обработайте событие:

private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e) 
{ 
    var cell = sender as DataGridCell; 

    // Do stuff with your cell 
} 

Проблема заключается в том, что ... DataGrid и столбцы являются привязкой к базе данных, поэтому большинство вещей, которые вы делаете для контента вашей камеры, не будут отражены в ваших фактических данных.

Я говорю «most», потому что вы могли бы по сути изменить текст ячейки и значение свойства базы данных одновременно ... Но это довольно грязно и на самом деле не принадлежит к виду ,

private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e) 
{ 
    var cell = sender as DataGridCell; 

    if (cell != null && cell.Content is TextBlock) 
    { 
     var textBlock = cell.Content as TextBlock; 
     textBlock.SetCurrentValue(TextBlock.TextProperty, "put your text here"); 
     var binding = BindingOperations.GetBindingExpression(textBlock, TextBlock.TextProperty); 
     binding.UpdateSource(); 
    } 
} 

Для этого, чтобы работать, вы должны установить Mode=TwoWay на вашем DataGridTextColumn креплениями (хотя это уже может быть режим по умолчанию, я не помню). Кроме того, он не работал с другими типами столбцов.

НО ... Как я уже сказал, это решение грязно, и вы хотите иметь такую ​​логику в своей модели viewmodel.

Простейший способ сделать это может заключаться в том, чтобы выставлять метод из вашей модели просмотра, который вы могли бы вызвать из кода, передавая некоторые параметры, такие как элемент данных строки и имя свойства столбца.

private void dataGrid1_CellDoubleClick(object sender, RoutedEventArgs e) 
{ 
    var cell = sender as DataGridCell; 

    if (cell != null) 
    { 
     (this.DataContext as MyViewModel).DoStuff(cell.DataContext, cell.Column.SortMemberPath); 
    } 
} 
Смежные вопросы