我正在尝试在XamDataGrid上传递项目,我在其上单击鼠标右键以打开ContextMenu,它在我的ViewModel中引发了一个Command。不知何故,Command调用的方法在调试模式下无法访问。
这是从视图中剪切的
<ig:XamDataGrid DataSource="{Binding DrdResults}" Height="700" Width="600">
<ig:XamDataGrid.ContextMenu>
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=Self},
Path=PlacementTarget.DataContext}"
AllowDrop="True" Name="cmAudit">
<MenuItem Header="View History"
Command="{Binding ViewTradeHistory}"
CommandParameter="{Binding Path=SelectedItems}">
</MenuItem>
</ContextMenu>
</ig:XamDataGrid.ContextMenu>
<ig:XamDataGrid.FieldSettings>
<ig:FieldSettings AllowFixing="NearOrFar"
AllowEdit="False"
Width="auto" Height="auto" />
</ig:XamDataGrid.FieldSettings>
</ig:XamDataGrid>
此视图的相应ViewModel中的代码如下所示。
public WPF.ICommand ViewTradeHistory
{
get
{
if (_viewTradeHistory == null)
{
_viewTradeHistory = new DelegateCommand(
(object SelectedItems) =>
{
this.OpenTradeHistory(SelectedItems);
});
}
return _viewTradeHistory;
}
}
最后,命令调用的实际方法如下所示
private void OpenTradeHistory(object records)
{
DataPresenterBase.SelectedItemHolder auditRecords
= (DataPresenterBase.SelectedItemHolder)records;
// Do something with the auditRecords now.
}
我不确定我在这里做错了什么。任何帮助将非常感谢。
谢谢, Shravan
答案 0 :(得分:14)
我通过改进达米安的答案(这不太合适)来完成这项工作。
这是我的解决方案:
首先是行为:
public class DataGridExtender : Behavior<XamDataGrid>
{
public readonly static DependencyProperty SelectedDataItemsProperty
= DependencyProperty.Register(
"SelectedDataItems",
typeof(ICollection<object>),
typeof(DataGridExtender),
new PropertyMetadata());
public ICollection<object> SelectedDataItems
{
get { return (ICollection<object>)GetValue(SelectedDataItemsProperty); }
set { SetValue(SelectedDataItemsProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectedItemsChanged += AssociatedObjectOnSelectedItemsChanged;
AssociatedObjectOnSelectedItemsChanged(AssociatedObject, null);
}
protected override void OnDetaching()
{
AssociatedObject.SelectedItemsChanged -= AssociatedObjectOnSelectedItemsChanged;
base.OnDetaching();
}
private void AssociatedObjectOnSelectedItemsChanged(object sender, Infragistics.Windows.DataPresenter.Events.SelectedItemsChangedEventArgs e)
{
if (SelectedDataItems != null)
{
SelectedDataItems.Clear();
foreach (var selectedDataItem in GetSelectedDataItems())
{
SelectedDataItems.Add(selectedDataItem);
}
}
}
private IEnumerable<object> GetSelectedDataItems()
{
var selectedItems = from rec in AssociatedObject.SelectedItems.Records.OfType<DataRecord>() select rec.DataItem;
return selectedItems.ToList().AsReadOnly();
}
}
然后使用它:
<igDP:XamDataGrid>
[...]
<i:Interaction.Behaviors>
<Behaviours:DataGridExtender SelectedDataItems="{Binding SelectedDataItems, Mode=TwoWay}"></Behaviours:DataGridExtender>
</i:Interaction.Behaviors>
[...]
<igDP:XamDataGrid.FieldLayoutSettings>
[...]
</igDP:XamDataGrid.FieldLayoutSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
[...]
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
当然,您需要在视图模型中使用“SelectedDataItems”。
编辑:视图模型中的SelectedDataItems
属性必须首先作为空集合进行即时快照,否则无效。
答案 1 :(得分:6)
对于单个项目,infragistics非常友好地添加一个名为“ActiveDataItem”的可绑定DependencyProperty,它是“所选项目”(如果有)。 它甚至可以双向工作,即您可以在ViewModel中重置选择。
不幸的是,AFAIK对于多选没有类似的东西。 你必须自己实现这个,迭代选定的记录,检查它们是否是datarecords,获取记录和dataitem等......
答案 2 :(得分:2)
尝试将DataGrid的SelectedItem绑定到viewmodel中的属性。
然后,您可以使用OpenTradeHistory()
方法访问此媒体资源。
答案 3 :(得分:2)
对于绑定到所选项目,我选择使用System.Interactivity:
创建行为using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Interactivity;
using Infragistics.Windows.DataPresenter;
namespace Sample {
public class DataGridExtender : Behavior<XamDataGrid> {
public readonly static DependencyProperty SelectedDataItemsProperty
= DependencyProperty.Register(
"SelectedDataItems"
, typeof(ICollection<object>)
, typeof(OzDataGridExtender)
, new PropertyMetadata(null));
public ICollection<object> SelectedDataItems {
get { return (ICollection<object>)GetValue(SelectedDataItemsProperty); }
set { SetValue(SelectedDataItemsProperty, value); }
}
protected override void OnAttached() {
base.OnAttached();
AssociatedObject.SelectedItemsChanged += AssociatedObjectOnSelectedItemsChanged;
AssociatedObjectOnSelectedItemsChanged(AssociatedObject, null);
}
protected override void OnDetaching() {
AssociatedObject.SelectedItemsChanged -= AssociatedObjectOnSelectedItemsChanged;
base.OnDetaching();
}
private void AssociatedObjectOnSelectedItemsChanged(object sender, Infragistics.Windows.DataPresenter.Events.SelectedItemsChangedEventArgs e) {
SelectedDataItems = GetSelectedDataItems();
//AssociatedObject.SetValue(SelectedDataItemsPropertyKey, SelectedDataItems);
}
private ICollection<object> GetSelectedDataItems() {
var selectedItems = from rec in AssociatedObject.SelectedItems.Records.OfType<DataRecord>()
select rec.DataItem;
return selectedItems.ToList().AsReadOnly();
}
}
}
您的视图中的某些内容将具有以下内容(为简洁起见,我省略了名称空间映射):
现在你在上下文菜单上绑定命令的问题还有别的......我会重新审视这个