DataGrid多行命令绑定

时间:2018-07-11 11:58:24

标签: c# wpf mvvm command

我正在使用MVVM模式。

我的问题如下: 我有一个绑定到命令的上下文菜单项,该命令一次仅支持一行,我能够将IsSelected属性绑定到每一行并对其进行迭代,但该命令一次仅支持一行在CanExecute方法中。

我正在模型中创建一个IsSelected属性:

private bool p_isSelected;
public bool IsSelected
{
    get => p_isSelected;
    set
    {
        p_isSelected = value;
        base.RaisePropertyChangedEvent("IsSelected");
    }
}

XAML:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow" BasedOn="{StaticResource MetroDataGridRow}">
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        <Setter Property="Background" Value="{Binding RowsBasedOnState}" />
        <Setter Property="Opacity" Value="{Binding RowOpacity}"/>
    </Style>
</DataGrid.RowStyle>

现在可以了,我可以遍历选定的行。

我的问题是,我有一个绑定到命令的上下文菜单项,它仅适用于单行。

示例:

<MenuItem Header="General" >
    <MenuItem Header="Stop" Command="{Binding Stop}"/>
    <MenuItem Header="Start" Command="{Binding Start}"/>
    <MenuItem Header="Refresh" Command="{Binding Refresh}" />
</MenuItem>

ViewModel:

public ICommand Stop { get; set; }
public ICommand Start { get; set; }
public ICommand Refresh { get; set; }

我在ViewModel构造函数中调用的内容:

private void Initialize()
{
    this.Stop = new StopCommand(this);
    this.Start = new StartCommand(this);
    this.Refresh = new RefreshCommand(this);
}

我的命令:

public class StartCommand : ICommand
{
    private readonly MainWindowViewModel m_ViewModel;

    public StartCommand(MainWindowViewModel viewModel)
    {
        m_ViewModel = viewModel;
    }

    public bool CanExecute(object parameter)
    {
        return true; //Replace with condition, make it check the condition per row and decide to execute individually on each row?
    }

    public event EventHandler CanExecuteChanged
    {
        add => CommandManager.RequerySuggested += value;
        remove => CommandManager.RequerySuggested -= value;
    }

    public void Execute(object parameter)
    {
        var selectedItem = m_ViewModel.SelectedItem; //SelectedItem is a property which is binded to SelectedItem in the datagrid xaml 
    }
}

我当前的命令结构仅支持一行,(事后看来,我可能只是将CanExecute移到Execute方法上并遍历模型中的所有项,并检查IsSelected和条件,但我认为不是)好的做法。)

我如何做到这一点,以便CanExecute将为每个选定的行决定是否可以执行命令?假设这不是我唯一的选择。

浏览了一段时间后,我得出一个结论,没有人遇到与我相同的问题,现在我恢复为在Execute方法中检查IsSelected。

0 个答案:

没有答案