2017-09-13 177 views
2

我有一个“CanUserAddRows = False”的数据网格,我想在按钮单击时添加一个新行并开始编辑它。这里是XAML:选择并编辑新添加的行中的第一个DataGrid单元格

<Window x:Class="TestDataGrid2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TestDataGrid2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Button Content="Add Item" HorizontalAlignment="Left" Click="Button_Click"/> 
     <DataGrid ItemsSource="{Binding Items}" Grid.Row="1" Name="MyGrid" AutoGenerateColumns="False" CanUserAddRows="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Value" Binding="{Binding Value}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

这里是后面的代码:

using System.Windows; 
using System.Windows.Controls; 

namespace TestDataGrid2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new MainViewModel(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      var mainViewModel = DataContext as MainViewModel; 
      if (mainViewModel != null) 
       mainViewModel.AddItem(); 

      var grid = MyGrid; 
      var cell = new DataGridCellInfo(grid.Items[grid.Items.Count - 1], grid.Columns[0]); 
      grid.CurrentCell = cell; 
      grid.BeginEdit(); 
     } 
    } 
} 

这是我的视图模型:

using System.Collections.ObjectModel; 

namespace TestDataGrid2 
{ 
    public class MainViewModel 
    { 
     public ObservableCollection<Item> Items { get; set; } = new ObservableCollection<Item>(); 

     public void AddItem() 
     { 
      Items.Add(new Item { Value = "New Item" }); 
     } 
    } 

    public class Item 
    { 
     public string Value { get; set; } 
    } 
} 

出于某种原因,我无法启动编辑单元格在新添加的行中。我怀疑这可能是因为在我称之为BeginEdit的时刻,视觉元素还不存在。有没有办法强制单元格加载以便能够进行对焦和编辑?或者当细胞准备就绪时,我是否可以订阅一个事件?

回答

3

或者当细胞准备就绪时,是否有可以订阅的事件?

使用调度:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var mainViewModel = DataContext as MainViewModel; 
    if (mainViewModel != null) 
     mainViewModel.AddItem(); 

    var grid = MyGrid; 
    var cell = new DataGridCellInfo(grid.Items[grid.Items.Count - 1], grid.Columns[0]); 
    grid.CurrentCell = cell; 
    Dispatcher.BeginInvoke(new Action(() => 
    { 
     grid.BeginEdit(); 
    }), System.Windows.Threading.DispatcherPriority.Background); 
} 
+0

100+更好地找到比所有其他解决方案 – SAT

+0

SelectionUnit = “细胞”, SelectionMode =“Single”,我删除了上面的AddItem代码 - 在新的(尚未提交的)DataGrid行内聚焦 – TerrorBight

相关问题