我正在使用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。