在 WPF DataGrid 中加载 UserControl
Loading a UserControl in WPF DataGrid
我正在构建 WPF MVVM 应用程序。我正在尝试在网格中加载 UserControl
,但 OnLoaded
方法没有触发。
这里是EventTrigger
在UserControl
,叫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 了解更多详细信息。
我正在构建 WPF MVVM 应用程序。我正在尝试在网格中加载 UserControl
,但 OnLoaded
方法没有触发。
这里是EventTrigger
在UserControl
,叫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 了解更多详细信息。