Mvvm Silverlight DataGrid.BeginEdit()不';t将单元格置于编辑模式
我有一个要求,我想添加一个新的空白行,我已经在网格中填写了一行,它还需要在编辑模式下,我可以开始键入后,立即达到单元格的标签 为此,我尝试使用datagrid的BeginEdit函数,但它似乎根本不起作用 这是我的代码:MainPage.xamlMvvm 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"
<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
或任何我们必须强制转换到该类的控件。