Параметр привязки команды контекстного меню сетки данных к значению столбца выбранной строки - PullRequest
0 голосов
/ 03 июня 2019

У меня есть сетка данных, привязанная к коллекции ObservableCollection. Сетка данных имеет контекстное меню. При щелчке по пункту контекстного меню запускается связанная команда, но я бы хотел передать параметр команды, связанный с Id выбранной строки сетки данных. Команда запускается, но параметр имеет значение null.

Ниже приведен код, который я пробовал.

 <DataGrid Name="users" ItemsSource="{Binding UsersModel}" CanUserAddRows="False" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Id}" Header="User Id" Width="auto"/>
        <DataGridTextColumn Binding="{Binding Name}" Width="*" Header="User Name"/>
        <DataGridTextColumn Binding="{Binding IsRegistered, Converter={StaticResource BoolToYesNoConverter}}" Width="auto" Header="Registered" />
        <DataGridTextColumn Binding="{Binding RegisteredOn}" Width="*" Header="Registration Date"/>
        </DataGrid.Columns>
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Modify" Command="{Binding Modify}" CommandParameter="{Binding Id}"/>
                <MenuItem Header="Delete" Command="{Binding Delete}" CommandParameter="{Binding Id}" />
            </ContextMenu>
        </DataGrid.ContextMenu>
</DataGrid>

Я ожидаю, что Id выбранной строки будет передан в качестве параметра команды.

Ответы [ 3 ]

1 голос
/ 03 июня 2019

Я бы создал свойство SelectedRow в вашей модели представления для сохранения выбранной строки в сетке, а затем связал команду элемента контекстного меню с командой в модели представления, которая ссылается на свойство SelectedRow.Мне пришлось использовать PlacementTarget в контекстном меню относительно источника.

// в viewmodel

public DelegateCommand ModifyCommand { get; }

ModifyCommand = new DelegateCommand(() => { var Id = SelectedRow.Id; //... });

private UsersModel _selectedRow;
public UsersModel SelectedRow
{
    get => _selectedRow;
    set
    {
        _selectedRow = value;
        OnPropertyChanged(nameof(SelectedRow));
    }
}

// в представлении

DataGrid Name="users" ItemsSource="{Binding Items}" CanUserAddRows="False" IsReadOnly="True" AutoGenerateColumns="False"
    SelectedItem="{Binding SelectedRow, Mode=TwoWay}" >

// and on context menu
<MenuItem Header="Modify" Command="{Binding PlacementTarget.DataContext.ModifyCommand, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
0 голосов
/ 03 июня 2019

Я полагаю, что ваш класс ViewModel реализовал интерфейс INotifyPropertyChanged, и я предполагаю, что вы реализуете метод для изменения свойств триггера, здесь я назвал этот метод RaisePropertyChanged.После всего этого, определите приватное поле selectedUsers и свойство с именем SelectedUsers в классе ViewModel:

private UsersModel selectedUsers;

public UsersModel SelectedUsers
    {
        get => _selectedFields;

        set
        {
            _selectedFields = value;
            Modify.RaiseCanExecuteChanged();
            Delete.RaiseCanExecuteChanged();
        }
    }

После того, как вы добавите его, вы должны добавить событие SelectionChanged к вашемуGrid, а затем в кодовом значении настройки для вашего selectedtedUser, как показано ниже:

private void usersGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        usersViewModel.SelectedUsers = usersGrid.SelectedItem as UsersModel;
    }

И связать selectedItem из DataGrid с selectedUser:

<DataGrid Name="users" ItemsSource="{Binding Items}" CanUserAddRows="False" 
IsReadOnly="True" AutoGenerateColumns="False"
SelectedItem="{Binding SelectedUser}" >

Когда вы выполняете эту работу, selectedUser становится доступным в вашей модели представления.

0 голосов
/ 03 июня 2019

Добавьте свойство SelectedId к вашей модели представления (где определены UsersModel и свойства команды) и привяжите свойство DataGrid SelectedValue к этому свойству.

Затем используйте SelectedId для привязки CommandParameter. Конечно, убедитесь, что SelectedId запускает событие PropertyChanged.

<DataGrid ... SelectedValuePath="Id" SelectedValue="{Binding SelectedId}">
    ...
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Modify"
                      Command="{Binding Modify}"
                      CommandParameter="{Binding SelectedId}"/>
            <MenuItem Header="Delete"
                      Command="{Binding Delete}"
                      CommandParameter="{Binding SelectedId}" />
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>
...