2017-06-21 88 views
1

在我的视图中,我有一个DataGrid,它存储2个递减类型的对象。每一行都有一个带有连接到ViewModel的命令的按钮。在ViewModel中,我需要找出哪种类型的对象已被选中。WPF MVVM - 通过ViewModel访问视图中DataGrid的DependencyProperty

问题是什么是在ViewModel中从Execute命令方法访问的SelectedItem属性的最好和简单方法?

到目前为止,我这样做是这样的:

var window = Application.Current.Windows.OfType<Window>() 
    .SingleOrDefault(x => x.IsActive); 

var dataGrid = (DataGrid) window.FindName("MyGridName"); 
... 

更新 - XAML中:

<DataGrid Name="MyGridName" ItemsSource="{Binding Elements}" 
      AutoGenerateColumns="False" CanUserAddRows="False" 
      CanUserDeleteRows="False" IsReadOnly="True"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Width="auto"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Name="OptionsBtn" Margin="5" Width="auto" 
        Height="30" Content="Options" 
        Command="{Binding ElementName=ElementsViewWindow, 
         Path=DataContext.ShowOptionsMenuCommand}"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
+3

绑定了'你的网格SelectedItem'一些VM属性或使用'CommandParameters'和停止不管你正在尝试做... – user3292642

+1

显示您的Xaml中的命令以及如何绑定它。我很高兴能向您展示如何使用该命令参数方法! – CHS

+0

'

回答

2

如果采取正确的方法MVVM这是很容易做到的。您只需要定义将绑定到您的DataGridItemsSource的某个实体的项目集合,并将其绑定到您的的SelectedItem。然后在您的命令中,只需引用您的模型的选定项目属性即可访问DataGrid中的选定项目。

以下是MVVM Light的示例实现。首先,你定义实体的可观察集合:

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; 
    } 
} 

最后,您创建视图元素并将它们绑定到ViewModel

<DataGrid ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="True" /> 
<Button Content="Do stuff" Command="{Binding DoWhateverCommand}" /> 
1

问题是什么是从ViewModel中的Execute命令函数访问DataGrid的SelectedItem属性的最佳和简单的方法?

只是一个属性添加到其中ShowOptionsMenuCommand属性定义的视图模型类和绑定DataGrid这一个的SelectedItem属性:

<DataGrid Name="MyGridName" ItemsSource="{Binding Elements}" SelectedItem="{Binding SelectedElement}" ... > 

然后你就可以访问源属性(SelectedElement或无论你选择怎么称呼它)直接从Execute方法。

另一种选择将是该项目通过为CommandParameter的命令:

<Button Name="OptionsBtn" ... Content="Options" 
     Command="{Binding ElementName=ElementsViewWindow, Path=DataContext.ShowOptionsMenuCommand}" 
     CommandParameter="{Binding}" />