在WPF DataGrid中加载UserControl



我正在构建一个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绑定。我测试了它的工作

<<p>Xaml代码/strong>
<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,就像这里的链接。

您可以点击这里查看更详细的信息。

最新更新