2010-12-17 30 views
1

新しい空白行を追加する必要があります。グリッド内の行に入力し、編集モードにする必要があります。私はすぐにタブでセルに達すると入力を開始することができます。Silverlight DataGrid.BeginEdit()はセルを編集モードにしません

このため、私はデータグリッドのBeginEdit機能を使用しようとしましたが、まったく動作していないようです。ここで

私のコードです: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()); 
      } 
     } 
    } 
} 

このテストアプリケーションは、MVVM Lighttoolkitプロジェクトテンプレートを使用して実行されます。あなたが何か情報が必要な場合は私に知らせてください。

乾杯---ぎざぎざ

+0

ありがとうdecyclone。私は書式設定の権利を得るために苦労していた:-) – Jag

答えて

2

私はこの同じ問題で苦労し、私はBeginEdit()を呼び出すに加えて、あなたはTextBoxにフォーカスを設定するにはPreparingCellForEdit()イベントを処理する必要があることがわかった:

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

Iこのソリューションは次の場所にあります:http://forums.silverlight.net/t/152064.aspx

+0

良いキャッチ!ありがとうございました!セルに別のコントロール、つまり「AutocompleteBox」がある場合、またはそのクラスにキャストする必要がある場合に追加するだけです。 –

0

この問題を解決するために、この問題を解決しました。 BeginEdit()を直接呼び出す代わりに、Dispatcherを使用して呼び出します。

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

この回答

は、ここで発見された: https://xceed.com/forums/topic/BeginEdit-function-just-focus-the-selected-cell/