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>

Но я действительно не предлагаю вам делать это.

Другие вопросы по тегам