silverlight中对datagrid添加右键菜单的注意事项。
今日在工作中有个小功能,需要右键点击datagrid的row显示右键菜单。
根据查询,需要对每一行绑定一个contenxtmenu.由于使用了MVVM,在绑定GRID数据源的时候发现loadrow事件加载的次数不正确,经过排查解决方案如下:
DataSource为数据源
不能使用 DataSource.Add(...)这种方式,我知道在大部分情况下,由于使用的双向绑定,直接修改datasource比较方面简洁。
正确的做法是从新新建一个变量,将值赋给变量,最后再将变量赋给DataSource.
正确的代码如下:
AKResponse response = obj as AKResponse;
if ( response.Result &&
response.ResponseContent != null &&
response.ResponseContent.ExecutingTaskResponses != null
&& response.ResponseContent.ExecutingTaskResponses.Count > 0 )
{
var result = new ObservableCollection<ExecutingTaskModel>();
response.ResponseContent.ExecutingTaskResponses.ForEach( item =>
{
var addItem = new ExecutingTaskModel()
{
Comments = item.Comments,
Progress = item.Progress,
Proprity = item.Proprity,
RequestID = item.RequestID,
RequestTime = item.RequestTime,
SourceDetail = item.SourceDetail,
Status = item.Status,
TagetDetail = item.TagetDetail,
TaskName = item.TaskName,
TaskType = item.TaskType,
TransferName = item.TransferName,
UserName = item.UserName
};
result.Add( addItem );
} );
DataSource = result;
这样datagrid的loadrow事件针对于每次row的加载只执行一次,如果对datasource直接add,将导致每次都加载一次loadrow,最后完成后还会再根据
datasource的数据源变更情况再加载一次。
完整代码如下:
LoadingRowCommand = new DelegateCommand<EventInformation<EventArgs>>( e =>
{
var Row = ( e.EventArgs as DataGridRowEventArgs ).Row;
Ai3MessageBox.Show( Row.GetIndex().ToString() );
if ( Row.GetIndex() > -1 )
{
ContextMenu cm = new ContextMenu();
MenuItem mi = new MenuItem();
mi.Header = "取消";
mi.Click += MenuItem_Click;
cm.Items.Add( mi );
ContextMenuService.SetContextMenu( Row, cm );
}
} );
private void MenuItem_Click( object sender, RoutedEventArgs e )
{
var p = ( (MenuItem)sender ).DataContext as ExecutingTaskModel;
if ( p != null )
{
Ai3MessageBox.Show(p.TaskName);
}
}