在datagrid wpf中使用selectedindex

时间:2014-07-31 10:45:42

标签: wpf binding datagrid mvvm-light selectedindex

我用mvvm灯学习wpf并且我遇到了问题。 我有一个带有查询的数据网格的用户控件。

现在我想在selectedIndex上添加一个事件来检索选定的行,然后我将该值传递给另一个用户控件。

问题是我的活动永远不会被解雇。

这就是我做的事情

<DataGrid HorizontalAlignment="Left" Name="dgUser" VerticalAlignment="Top" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" SelectedItem="{Binding selectedRow, Mode=TwoWay}"  Width="800" Height="253" >

以下是我的viewmodel

的代码
public RelayCommand selectedRow { get; private set; }
    private int _selectedIndex;
    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set
        {
            _selectedIndex = value;
            RaisePropertyChanged("SelectedIndex");
        }
    }
    /// <summary>
    /// Initializes a new instance of the ListUserViewModel class.
    /// </summary>
    public ListUserViewModel()
    {
        selectedRow = new RelayCommand(() => SelectedRowChange());
        SelectedIndex = 2;
    }

    private void SelectedRowChange()
    {
        System.Windows.MessageBox.Show("test");
    }

未使用SelectedXIndex = 2选择我的行 当我选择另一行时没有任何事情发生

1 个答案:

答案 0 :(得分:0)

您正在尝试将ViewModel上的Command绑定到DataGrid的SelectedItem,但这并不是它的工作方式。

您想要挂钩DataGrid.SelectionChanged事件,并且可能会在此时触发您的ViewModel的RelayCommand

Check this answer有关如何在XAML中执行此操作的详细说明。

编辑:

要将SelectedItem作为命令参数传递给RelayCommand,请在XAML中使用以下内容:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding MyCommand}" 
        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

并确保将RelayCommand更改为您希望的类型。

注意:您尚未提供DataGrid中所有商品的类型,因此我会在此处使用object

public RelayCommand<object> selectedRow { get; private set; }

然后,您可以依赖命令的参数作为所选项目:

public ListUserViewModel()
{
    selectedRow = new RelayCommand(i => SelectedRowChange(i));
    SelectedIndex = 2;
}

private void SelectedRowChange(object selectedItem)
{
    // selectedItem is the item that has just been selected
    // do what you wish with it here
    System.Windows.MessageBox.Show("test");
}