Mvvm Silverlight DataGrid.BeginEdit()不';t将单元格置于编辑模式

Mvvm Silverlight DataGrid.BeginEdit()不';t将单元格置于编辑模式,mvvm,datagrid,silverlight-4.0,mvvm-light,Mvvm,Datagrid,Silverlight 4.0,Mvvm Light,我有一个要求,我想添加一个新的空白行,我已经在网格中填写了一行,它还需要在编辑模式下,我可以开始键入后,立即达到单元格的标签 为此,我尝试使用datagrid的BeginEdit函数,但它似乎根本不起作用 这是我的代码:MainPage.xaml <UserControl x:Class="DataGridTest.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我有一个要求,我想添加一个新的空白行,我已经在网格中填写了一行,它还需要在编辑模式下,我可以开始键入后,立即达到单元格的标签

为此,我尝试使用datagrid的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();
            }
        }
    }
}
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());
            }
        }
    }
}
使用System.Windows.Controls;
使用DataGridTest.ViewModel;
使用GalaSoft.MvvmLight.Messaging;
命名空间DataGridTest
{    
公共部分类主页面:UserControl
{  
公共主页()
{  
初始化组件();
Messenger.Default.Register(这个,MakeDataGridEditable);
}  
公共void MakeDataGridEditable(布尔标志)
{
国际单项体育联合会(旗)
{
dgTest.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateSource();
MainViewModel dataContext=作为MainViewModel的dataContext;
dgTest.SelectedIndex=dataContext.DataGridItems.Count-1;
dgTest.CurrentColumn=dgTest.Columns[0];
dgTest.UpdateLayout();
dgTest.Focus();
dgTest.BeginEdit();
}
}
}
}
MainViewModel.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();
            }
        }
    }
}
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());
            }
        }
    }
}
使用系统;
使用System.Collections.ObjectModel;
使用系统组件模型;
使用GalaSoft.MvvmLight;
使用GalaSoft.MvvmLight.Messaging;
命名空间DataGridTest.ViewModel
{     
公共类MainViewModel:ViewModelBase
{  
DataGridItem DataGridItem;
私有ObservableCollection dataGridItems;
公共可观测集合DataGridItems
{
得到
{
返回数据项;
}
设置
{
dataGridItems=值;
RaisePropertyChanged(“DataGridItems”);
}
}
公共主视图模型()
{
如果(IsInDesignMode)
{
//代码在混合-->创建设计时数据中运行。
}
其他的
{
//代码“真实地”运行
dataGridItems=新的ObservableCollection();
dataGridItem=新的dataGridItem();
添加(dataGridItem);
dataGridItem.ChangesCommitted+=新事件处理程序(dataGridItem\u ChangesCommitted);
}
}
无效dataGridItem_变更提交(对象发送方,事件参数e)
{
dataGridItem.ChangesCommitted-=新事件处理程序(dataGridItem\u ChangesCommitted);
CreateNewDataGridItem();
dataGridItem.ChangesCommitted+=新事件处理程序(dataGridItem\u ChangesCommitted);
Messenger.Default.Send(true);
}
私有void CreateNewDataGridItem()
{
this.dataGridItem=新dataGridItem();
this.dataGridItems.Insert(dataGridItems.Count,dataGridItem);
}
}
公共类DataGridItem:IEditableObject
{
公共字符串ItemCode{get;set;}
公共字符串ItemDescription{get;set;}
public void BeginEdit()
{
}
公共作废取消编辑()
{
}
已提交公共事件事件处理程序更改;
公共无效EndEdit()
{
如果(空!=变更提交)
{
EventArgs e=新的EventArgs();
ChangesCommitted(这是新的EventArgs());
}
}
}
}
此测试应用程序使用MVVM Lighttoolkit项目模板完成。如果你需要更多的信息,请告诉我


干杯---Jag

我也在为同样的问题苦苦挣扎,我发现除了调用
BeginEdit()
之外,您还需要处理
PreparingCellForEdit()
事件来设置
文本框的焦点:

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

我在这里找到了这个解决方案:

这个解决方案为我解决了这个问题。它不直接调用
BeginEdit()
,而是使用调度程序来调用它

var action = new Action(() =>
{
    dataGrid.BeginEdit();
});
this.Dispatcher.BeginInvoke(action, System.Windows.Threading.DispatcherPriority.ApplicationIdle, null);
答案就在这里:

谢谢你的脱气旋。我正在努力使格式正确:-)好主意!非常感谢。我只想补充一下,如果Cell有另一个控件,例如,
AutocompleteBox
或任何我们必须强制转换到该类的控件。