WebView Navigated Event .NET MAUI с использованием CommunityToolkit.MVVM и EventToCommand
Я использую [RelayCommand] для обработки навигационного события WebView в .NET MAUI.
async void Navigated(WebNavigatedEventArgs args)
Я связал его в своем XAML, используя
<toolkit:EventToCommandBehavior
EventName="Navigated"
Command="{Binding NavigatedCommand}" />
Команда срабатывает, аргументы нулевые. Я что-то пропустил?
Редактировать: я хочу немного прояснить это.
Команда вызывается правильно, когда возникает событие. Аргументы в этой команде (аргументы WebNavigatedEventArgs) равны нулю.
Если это используется как событие на странице, проблем нет. Аргументы содержат ответ, и он правильный.
Я использую CommunityToolkit.Maui версии 1.2.0. И CommunityToolkit.MVVM версии 8.0.0.
Edit2: после тестирования на другом компьютере тот же код работает правильно, и аргументы передаются команде. (Зависимость 6.0.400)
После обновления до 6.0.486 параметры команды стали нулевыми.
1 ответ
аргументы равны нулю
Что это значит? Я сделал образец, и он работал хорошо.
XAML:
<VerticalStackLayout>
<WebView HeightRequest="700" Source="">
<WebView.Behaviors>
<toolkit:EventToCommandBehavior
EventName="Navigated"
Command="{Binding IncrementCounterCommand}"/>
</WebView.Behaviors>
</WebView>
<Label Text="{Binding Counter}" HeightRequest="50" BackgroundColor="Red" TextColor="Green" FontSize="Large"/>
</VerticalStackLayout>
Модель просмотра:
public class MyViewModel : ObservableObject
{
public MyViewModel()
{
IncrementCounterCommand = new RelayCommand(IncrementCounter);
}
private int counter;
public int Counter
{
get => counter;
private set => SetProperty(ref counter, value);
}
public ICommand IncrementCounterCommand { get; }
private void IncrementCounter() => Counter++;
}
Или вы хотите добавить навигационное событие в page.cs, вы можете попробовать:
В xaml:
<VerticalStackLayout>
<WebView Navigated="WebView_Navigated" HeightRequest="700" Source=""/>
<Label Text="{Binding Counter}" HeightRequest="50" BackgroundColor="Red" TextColor="Green" FontSize="Large"/>
</VerticalStackLayout>
На странице.cs:
private void WebView_Navigated(object sender, WebNavigatedEventArgs e)
{
//do something
}
Кроме того, я также попытался использовать их вместе и обнаружил, что сначала выполняется событие навигации, а затем команда.
Обновите способ передачи WebNavigatedEventArgs в модель представления.
В модели представления:
public class MyViewModel : ObservableObject
{
public WebNavigatedEventArgs webNavigatedEventArgs;
public MyViewModel()
{
IncrementCounterCommand = new RelayCommand(IncrementCounter);
}
public ICommand IncrementCounterCommand { get; }
private void IncrementCounter() => Navigated(webNavigatedEventArgs);
private async void Navigated(WebNavigatedEventArgs arg)
{
}
}
На странице.cs:
private void WebView_Navigated(object sender, WebNavigatedEventArgs e)
{
var viewmodel = (MyViewModel)this.BindingContext;
viewmodel.webNavigatedEventArgs = e;
}
В xaml:
<WebView Navigated="WebView_Navigated" HeightRequest="700" Source=">
<WebView.Behaviors>
<toolkit:EventToCommandBehavior
EventName="Navigated"
Command="{Binding IncrementCounterCommand}"/>
</WebView.Behaviors>
</WebView>
Но я действительно не предлагаю вам делать это.