我正在构建一个WPF MVVM应用程序。我试图在网格内加载UserControl
,但OnLoaded
方法不触发。
这是UserControl
中的EventTrigger
,称为Selector
:
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding OnLoadedCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
以下是SelectorViewModel
中的代码:
public RelayCommand OnLoadedCommand { get; set; }
public SelectorViewModel(MapService mapService)
{
this.mapService = mapService ?? throw new ArgumentNullException(nameof(mapService));
OnLoadedCommand = new RelayCommand(OnLoaded);
}
public async void OnLoaded()
{
AvailablePositions = await mapService.GetPositions();
//other code
}
UserControl
被加载到的网格的View
:
<local:Selector Grid.Row="0" Margin="{StaticResource SmallLeftTopMargin}" />
网格的ViewModel
,其中UserControl
被加载到:
public SelectorViewModel SelectorViewModel { get; set; }
public MapViewModel(MapService mapService)
{
SelectorViewModel = new SelectorViewModel(mapService);
}
方法根本没有被调用的原因可能是什么?我在SelectorViewModel
的构造函数中放置了一个断点,它击中了它,但它没有击中OnLoaded()
中的一个。
方法是async
的事实是一个问题吗?
编辑:
我尝试将命令设置为:
OnLoadedCommand = new RelayCommand(async () => await OnLoaded());
并将OnLoaded
的返回类型从void
更改为Task
,但仍然不起作用。
您可以像下面这样将它与Command
绑定。我测试了它的工作
<DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding OnLoadedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
ViewModel
class MainWindowViewModel
{
public AsyncCommand OnLoadedCommand { get; set; }
public MainWindowViewModel()
{
OnLoadedCommand = new AsyncCommand(async () => await OnLoaded());
}
public async Task OnLoaded()
{
Console.WriteLine("Loaded");
}
}
异步命令
public interface IAsyncCommand : ICommand
{
Task ExecuteAsync(object parameter);
}
public class AsyncCommand : AsyncCommandBase
{
private readonly Func<Task> _command;
public AsyncCommand(Func<Task> command)
{
_command = command;
}
public override bool CanExecute(object parameter)
{
return true;
}
public override Task ExecuteAsync(object parameter)
{
return _command();
}
}
AsyncCommandBase
public abstract class AsyncCommandBase : IAsyncCommand
{
public abstract bool CanExecute(object parameter);
public abstract Task ExecuteAsync(object parameter);
public async void Execute(object parameter)
{
await ExecuteAsync(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
protected void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
}
我也建议你订阅Method,就像这里的链接。
您可以点击这里查看更详细的信息。