在 WPF DataGrid 中加载 UserControl

Loading a UserControl in WPF DataGrid

我正在构建 WPF MVVM 应用程序。我正在尝试在网格中加载 UserControl,但 OnLoaded 方法没有触发。

这里是EventTriggerUserControl,叫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 的 return 类型从 void 更改为 Task 但它仍然无效。

您可以像下面那样用 Command 绑定它。我测试过它有效。

Xaml代码

       <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();
    }
}

我还建议您订阅 link here 中的方法。

您可以查看 here 了解更多详细信息。