2010-12-17 6 views
1

Ich habe eine Anforderung, wo ich eine neue leere Zeile hinzufügen möchte, die ich in einer Zeile im Raster ausgefüllt habe und es muss auch im Bearbeitungsmodus wo sein Ich kann sofort mit dem Tippen beginnen, nachdem ich mit der Tabulatortaste auf der Zelle angekommen bin.Silverlight DataGrid.BeginEdit() setzt die Zelle nicht in den Bearbeitungsmodus

Dafür habe ich versucht, die BeginEdit-Funktion des Datagrid zu verwenden, aber es scheint überhaupt nicht zu funktionieren.

Hier ist mein Code: MainPage.xaml

<UserControl x:Class="DataGridTest.MainPage" 
     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" 
     mc:Ignorable="d" 
     Height="192" 
     Width="356" 
     DataContext="{Binding Main, Source={StaticResource Locator}}" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> 

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Skins/MainSkin.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot"> 

    <TextBlock FontSize="36" 
       FontWeight="Bold" 
       Foreground="Purple" 
       Text="{Binding Welcome}" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       TextWrapping="Wrap" /> 
    <sdk:DataGrid AutoGenerateColumns="True" Height="100" HorizontalAlignment="Left" Margin="12,51,0,0" Name="dgTest" VerticalAlignment="Top" Width="332" ItemsSource="{Binding DataGridItems,Mode=TwoWay}" /> 
</Grid> 

MainPage.xaml.cs

using System.Windows.Controls;  
using DataGridTest.ViewModel; 
using GalaSoft.MvvmLight.Messaging;  

namespace DataGridTest  
{  
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
      Messenger.Default.Register<bool>(this, MakeDataGridEditable); 
     } 

     public void MakeDataGridEditable(bool flag) 
     { 
      if (flag) 
      { 
       dgTest.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateSource(); 

       MainViewModel dataContext = DataContext as MainViewModel; 

       dgTest.SelectedIndex = dataContext.DataGridItems.Count - 1; 
       dgTest.CurrentColumn = dgTest.Columns[0]; 
       dgTest.UpdateLayout(); 

       dgTest.Focus(); 
       dgTest.BeginEdit(); 
      } 
     } 
    } 
} 

MainViewModel.cs

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Messaging; 

namespace DataGridTest.ViewModel 
{  
    public class MainViewModel : ViewModelBase 
    { 
     DataGridItem dataGridItem; 

     private ObservableCollection<DataGridItem> dataGridItems; 
     public ObservableCollection<DataGridItem> DataGridItems 
     { 
      get 
      { 
       return dataGridItems; 
      } 
      set 
      { 
       dataGridItems = value; 
       RaisePropertyChanged("DataGridItems"); 
      } 
     } 


     public MainViewModel() 
     { 
      if (IsInDesignMode) 
      { 
       // Code runs in Blend --> create design time data. 
      } 
      else 
      { 
       // Code runs "for real" 
       dataGridItems = new ObservableCollection<DataGridItem>(); 
       dataGridItem = new DataGridItem(); 
       dataGridItems.Add(dataGridItem); 
       dataGridItem.ChangesCommitted += new EventHandler<EventArgs>(dataGridItem_ChangesCommitted); 
      } 
     } 

     void dataGridItem_ChangesCommitted(object sender, EventArgs e) 
     { 
      dataGridItem.ChangesCommitted -= new EventHandler<EventArgs>(dataGridItem_ChangesCommitted); 
      CreateNewDataGridItem(); 
      dataGridItem.ChangesCommitted += new EventHandler<EventArgs>(dataGridItem_ChangesCommitted); 
      Messenger.Default.Send<bool>(true); 
     } 

     private void CreateNewDataGridItem() 
     { 
      this.dataGridItem = new DataGridItem(); 
      this.dataGridItems.Insert(dataGridItems.Count, dataGridItem); 
     } 
    } 

    public class DataGridItem : IEditableObject 
    { 
     public string ItemCode { get; set; } 
     public string ItemDescription { get; set; } 

     public void BeginEdit() 
     { 
     } 

     public void CancelEdit() 
     { 
     } 

     public event EventHandler<EventArgs> ChangesCommitted; 
     public void EndEdit() 
     { 
      if (null != ChangesCommitted) 
      { 
       EventArgs e = new EventArgs(); 
       ChangesCommitted(this, new EventArgs()); 
      } 
     } 
    } 
} 

Diese Testanwendung wird mithilfe der MVVM Lighttoolkit-Projektvorlage erstellt. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Prost --- Jag

+0

Dank decyclone: ​​

var action = new Action(() => { dataGrid.BeginEdit(); }); this.Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.ApplicationIdle, null); 

Diese Antwort wurde hier gefunden. Ich hatte Mühe, die Formatierung richtig zu machen :-) – Jag

Antwort

2

ich mit dem gleichen Problem zu kämpfen, fand ich, dass Sie die PreparingCellForEdit() Veranstaltung den Schwerpunkt auf den TextBox behandeln zusätzlich BeginEdit() zu rufen müssen:

private void dgTest_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e) 
{ 
    TextBox tb = e.EditingElement as TextBox; 
    if (tb != null) 
    { 
     tb.Focus(); 
    } 
} 

I habe diese Lösung hier gefunden: http://forums.silverlight.net/t/152064.aspx

+0

Guter Fang! Vielen Dank! Ich möchte nur hinzufügen, falls Cell eine andere Kontrolle hat, d. H. 'AutocompleteBox' oder irgendwas, das wir in diese Klasse werfen müssen. –

Verwandte Themen