我正在嘗試設定一個資料網格,以便當網格接收焦點時,當前/選定的行進入指定單元格的編輯模式。不幸的是,該行仍然需要單擊滑鼠才能使單元格進入編輯模式。
網格通過系結到布林值的 datatrigger 獲得焦點,這會正確觸發后面代碼中的 GotFocus 方法,該方法應該指定當前單元格和 BeginEdit。
XML 代碼:
<DataGrid x:Name="SampleAliquotsDataGrid" ItemsSource="{Binding Source={StaticResource cvsSampleModels}}"
CurrentItem="{Binding CurrentSampleAliquot, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
SelectedItem="{Binding CurrentSampleAliquot, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AutoGenerateColumns="False" Grid.Row="1" SelectionUnit="FullRow"
GotFocus="SampleAliquotsDataGrid_GotFocus"
>
<DataGrid.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding DataGridHasFocus}" Value="True">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=SampleAliquotsDataGrid}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
<DataGrid.Columns>
<DataGridTemplateColumn Header="RecordID" Width="Auto" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding DBRecordID}" HorizontalContentAlignment="Right"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn x:Name="MeasuredResult" Binding="{Binding MeasuredResult, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="MeasuredResult"
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>
</DataGrid.Columns>
</DataGrid>
要編輯的單元格是 DataGridTextColumn“MeasuredResult”。
后面的gotfocus代碼:
private void SampleAliquotsDataGrid_GotFocus(object sender, RoutedEventArgs e)
{
DataGrid grid = sender as DataGrid;
grid.CurrentCell = new DataGridCellInfo(grid.SelectedItem, grid.Columns[1]);
grid.BeginEdit();
e.Handled = true;
}
我嘗試更改當前單元格的設定方式,在呼叫 BeginEdit 之前重新關注網格,將選擇單元更改為單元格而不是全行。
希望解決方案不太復雜,我的 WPF 技能并不復雜。
uj5u.com熱心網友回復:
我提出以下行為:
- 在選定行上單擊單元格時,其行為
DataGrid不變。 - 當一個單元格在未選擇的行上單擊時,它的行被選中,并且其中的單元格
AutoEditColumn被設定為編輯模式。 - 當
DataGrid從鍵盤(選項卡導航)獲得焦點時AutoEditColumn,所選行中的單元格設定為編輯模式。
為此,可以監聽CurrentCellChanged事件。
這是一個實作所描述行為的輔助類:
private class AutoEditColumnHelper : IDisposable
{
private readonly DataGrid _dataGrid;
private readonly int _columnIndex;
private object? _lastItem;
public AutoEditColumnHelper(DataGrid dataGrid, int columnIndex)
{
_dataGrid = dataGrid;
_columnIndex = columnIndex;
_dataGrid.CurrentCellChanged = OnCurrentCellChanged;
}
public void Dispose()
{
_dataGrid.CurrentCellChanged -= OnCurrentCellChanged;
}
private void OnCurrentCellChanged(object? sender, EventArgs e)
{
var currentCell = _dataGrid.CurrentCell;
if (!currentCell.IsValid || Equals(currentCell.Item, _lastItem))
return;
var autoEditColumn = GetAutoEditColumn();
if (autoEditColumn is null)
return;
_dataGrid.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, () =>
{
_lastItem = _dataGrid.SelectedItem;
_dataGrid.CurrentCell = new DataGridCellInfo(_lastItem, autoEditColumn);
_dataGrid.BeginEdit();
});
}
private DataGridColumn? GetAutoEditColumn()
{
return _columnIndex < 0 || _columnIndex > _dataGrid.Columns.Count ? null : _dataGrid.Columns[_columnIndex];
}
}
要使用這個類,AttachedProperty是推薦的方式。
首先,我們宣告一個公共AutoEditColumn附加屬性,它將AutoEditColumn索引存盤在一個int.
然后,我們宣告一個私有附加屬性,為每個具有屬性AutoEditColumnHelper的物件存盤下面的實體。AutoEditColumnHelperDataGridAutoEditColumn
public static readonly DependencyProperty AutoEditColumnProperty = DependencyProperty.RegisterAttached("AutoEditColumn", typeof(int), typeof(DataGridEx), new PropertyMetadata(default(int), AutoEditColumnChangedCallback));
public static void SetAutoEditColumn(DependencyObject element, int value)
{
element.SetValue(AutoEditColumnProperty, value);
}
public static int GetAutoEditColumn(DependencyObject element)
{
return (int)element.GetValue(AutoEditColumnProperty);
}
private static void AutoEditColumnChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not DataGrid dataGrid)
return;
GetAutoEditColumnHelper(dataGrid)?.Dispose();
if (e.NewValue is int columnIndex)
{
SetAutoEditColumnHelper(d, new AutoEditColumnHelper(dataGrid, columnIndex));
}
else
{
d.ClearValue(AutoEditColumnHelperProperty);
}
}
private static readonly DependencyProperty AutoEditColumnHelperProperty = DependencyProperty.RegisterAttached("AutoEditColumnHelper", typeof(AutoEditColumnHelper), typeof(DataGridEx), new PropertyMetadata(default(AutoEditColumnHelper)));
private static void SetAutoEditColumnHelper(DependencyObject element, AutoEditColumnHelper value)
{
element.SetValue(AutoEditColumnHelperProperty, value);
}
private static AutoEditColumnHelper? GetAutoEditColumnHelper(DependencyObject element)
{
return element.GetValue(AutoEditColumnHelperProperty) as AutoEditColumnHelper;
}
最后在代碼AutoEditColumn中使用了附加屬性:xaml
<DataGrid AutoGenerateColumns="False"
so71475662:DataGridEx.AutoEditColumn="1"
ItemsSource="{Binding Path=Items}"
SelectionMode="Single"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Label}" Header="Label" />
<DataGridTextColumn Binding="{Binding Value}" Header="Value" />
</DataGrid.Columns>
</DataGrid>
完整的作業示例可在此處獲得。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/444520.html
