在我的视图中,我有一个DataGrid
,它存储了2种降序类型的对象。每行都有一个Button,其Command连接到ViewModel。在ViewModel中,我需要找出选择了哪种类型的对象。
问题是在ViewModel中从SelectedItem
命令方法访问DataGrid
的{{1}}属性的最佳和最简单方法是什么?
到目前为止,我这样做了:
Execute
更新 - Xaml:
var window = Application.Current.Windows.OfType<Window>()
.SingleOrDefault(x => x.IsActive);
var dataGrid = (DataGrid) window.FindName("MyGridName");
...
答案 0 :(得分:2)
如果采用正确的MVVM方法,这很容易做到。您所需要的只是定义将绑定到ItemsSource
的{{1}}的实体的项集合以及将绑定到DataGrid
的{{1}}的属性。然后,在您的命令中,您只需引用模型的所选商品属性即可访问SelectedItem
中的所选商品。
以下是MVVM Light的示例实现。首先,定义一个可观察的实体集合:
DataGrid
然后定义一个属性来保存所选项目:
DataGrid
之后,您定义了一个处理业务逻辑的命令:
public const string ItemsCollectionPropertyName = "ItemsCollection";
private ObservableCollection<DataItem> _itemsCollection = null;
public ObservableCollection<DataItem> ItemsCollection
{
get
{
return _itemsCollection;
}
set
{
if (_itemsCollection == value)
{
return;
}
_itemsCollection = value;
RaisePropertyChanged(ItemsCollectionPropertyName);
}
}
最后,您创建视图元素并将它们绑定到public const string SelectedItemPropertyName = "SelectedItem";
private DataItem _selectedItem = null;
public DataItem SelectedItem
{
get
{
return _selectedItem;
}
set
{
if (_selectedItem == value)
{
return;
}
_selectedItem = value;
RaisePropertyChanged(SelectedItemPropertyName);
}
}
:
private ICommand _doWhateverCommand;
public ICommand DoWhateverCommand
{
get
{
if (_doWhateverCommand == null)
{
_doWhateverCommand = new RelayCommand(
() => { /* do your stuff with SelectedItem here */ },
() => { return SelectedItem != null; }
);
}
return _doWhateverCommand;
}
}
答案 1 :(得分:1)
问题是从ViewModel中的执行命令功能访问DataGrid的SelectedItem属性的最佳和简单方法是什么?
只需将属性添加到定义了ShowOptionsMenuCommand
属性的视图模型类中,并将SelectedItem
的{{1}}属性绑定到此属性:
DataGrid
然后,您可以直接从<DataGrid Name="MyGridName" ItemsSource="{Binding Elements}" SelectedItem="{Binding SelectedElement}" ... >
方法访问源属性(SelectedElement
或您选择调用它的任何内容)。
另一种选择是将项目作为Execute
传递给命令:
CommandParameter