WPF MVVM - 从ViewModel访问View中的DataGrid的DependencyProperty

时间:2017-06-21 08:42:30

标签: c# wpf mvvm viewmodel dependency-properties

在我的视图中,我有一个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");
...

2 个答案:

答案 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