2017-09-13 178 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

相關問題