использование selectedindex в datagrid wpf

Я изучаю wpf с помощью mvvm light, и у меня возникла проблема. У меня есть пользовательский элемент управления с сеткой данных, загруженной запросом.

Теперь я хотел бы добавить событие в selectedIndex, чтобы получить выбранную строку, и после этого я передам значение другому пользовательскому элементу управления.

проблема в том, что мое событие никогда не запускается.

Вот что я сделал

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

Вот код моей модели просмотра

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, и ничего не происходит, когда я выбираю другую строку


person user1898765    schedule 31.07.2014    source источник
comment
SelectedItem — это не событие, это свойство. SelectionChanged это событие. Попробуйте использовать его.   -  person Debasis    schedule 31.07.2014
comment
selectionChanged генерирует исключение, кроме случаев, когда я использую EventTrigger   -  person user1898765    schedule 31.07.2014


Ответы (1)


Вы пытаетесь связать Command своей ViewModel с SelectedItem вашей DataGrid, и это не совсем то, как это работает.

Вы хотите подключиться к событию DataGrid.SelectionChanged и, предположительно, запустить RelayCommand вашей ViewModel в этот момент.

Проверьте этот ответ, чтобы получить отличное объяснение того, как это сделать в 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");
}
person Daniel May    schedule 31.07.2014
comment
спасибо, я использую EventTrigger, и мое событие запускается с помощью окна сообщений, но как я могу получить значение выбранной строки? - person user1898765; 31.07.2014
comment
Вы можете передать SelectedItem в качестве параметра вашему RelayCommand через другие примеры в этом посте. Если это ответ на ваш вопрос, нажмите зеленую галочку слева. - person Daniel May; 31.07.2014
comment
Не могли бы вы объяснить мне, как использовать параметр команды? и моя строка не из модели, а с query.tolist() - person user1898765; 31.07.2014
comment
Обновлено. Если у вас есть дополнительные вопросы, пожалуйста, задайте другой вопрос. - person Daniel May; 31.07.2014
comment
Параметр команды. RelayCommand<object>. Вам нужно больше узнать о WPF и MVVM Light, если вы этого не понимаете. - person Daniel May; 31.07.2014