[英]EventToCommandBehavior throws InvalidOperationException in MAUI for checkbox
選中/取消選中復選框后,我需要運行命令。 復選框通過 StackLayout 的項目源呈現在頁面中,EventToCommandBehavior 來自 MAUI CommunityToolkit。
當應該呈現頁面時拋出異常,很可能是在解析和處理 XAML 時。 異常消息說:“由於 object 的當前 state,操作無效。”,這不是很有幫助(我缺少什么 state,誰是所有者,什么是無效的)。
也許 callstact 會幫助某人?
at Microsoft.Maui.Controls.Binding.ApplyRelativeSourceBinding(BindableObject targetObject, BindableProperty targetProperty) in D:\a\_work\1\s\src\Controls\src\Core\Binding.cs:line 152
at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state)
at Android.App.SyncContext.<>c__DisplayClass2_0.<Post>b__0() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:line 36
at Java.Lang.Thread.RunnableImplementor.Run() in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:line 36
at Java.Lang.IRunnableInvoker.n_Run(IntPtr jnienv, IntPtr native__this) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net6.0/android-31/mcw/Java.Lang.IRunnable.cs:line 84
at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V(_JniMarshal_PP_V callback, IntPtr jnienv, IntPtr klazz) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrap
我在 Xamarin 中多次使用相同的技術。它按預期在那里工作,但在 MAUI 中,以下代碼拋出 InvalidOperationException。 內容頁面和視圖 model 已正確創建(構造函數通過),但稍后某處拋出異常,老實說不知道為什么。
<StackLayout
BindableLayout.ItemsSource="{Binding GameVariants}">
<BindableLayout.ItemTemplate>
<DataTemplate x:DataType="bindable:SelectExpansion">
<StackLayout Orientation="Horizontal" VerticalOptions="Center">
<CheckBox
IsEnabled="{Binding IsExpansion}"
IsChecked="{Binding Selected}">
<CheckBox.Behaviors>
<toolkit:EventToCommandBehavior
EventName="CheckedChanged"
Command="{Binding Source={RelativeSource AncestorType={x:Type vm:SelectExpansionsPageViewModel}}, Path=SelectExpansionCommand}"
CommandParameter="{Binding .}" />
</CheckBox.Behaviors>
</CheckBox>
<Label Text="{Binding Expansion}" VerticalTextAlignment="Center" />
</StackLayout>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
后面的代碼僅包含通過依賴項設置上下文。
public partial class SelectExpansionsPage : ContentPage
{
public SelectExpansionsPage(SelectExpansionsPageViewModel vm)
{
BindingContext = vm;
InitializeComponent();
}
}
這是頁面的視圖 model。
public partial class SelectExpansionsPageViewModel : ObservableObject
{
public SelectExpansionsPageViewModel(Game state)
{
GameVariants = new ObservableCollection<SelectExpansion>(AvailableExpansions.Expansions.Select(item =>
{
item.Selected = state.Expansions.Contains(item.Expansion);
return item;
}));
}
public ObservableCollection<SelectExpansion> GameVariants { get; }
[RelayCommand]
public void SelectExpansion(SelectExpansion item)
{
Debug.WriteLine("Select item changed");
}
}
經過一些研究,我發現行為不是可視化樹的一部分(抱歉,鏈接丟失了)。
要克服這一點,必須通過引用來引用源綁定,請參閱引用內容頁面的x:Name
的“This” 。 ViewModel
只是ContentPage
的強類型屬性,它引用未裝箱的BindingContext
。
旁注:問題涉及 .NET MAUI,但是,我不得不遷移回 Xamarin Forms,因為當時 .NET MAUI 有很多阻礙開發和應用程序發布的錯誤。 兩個框架的問題是一樣的。
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:vm="clr-namespace:Everdell.ViewModels;assembly=Everdell"
xmlns:toolkit="http://xamarin.com/schemas/2020/toolkit"
x:Class="Everdell.Views.SelectExpansionsView"
x:DataType="vm:SelectExpansionsViewModel"
x:Name="This">
<ContentPage.Content>
<CheckBox>
<CheckBox.Behaviors>
<toolkit:EventToCommandBehavior
EventName="CheckedChanged"
Command="{Binding Source={x:Reference This}, Path=ViewModel.SelectExpansionCommand}"
CommandParameter="{Binding .}" />
</CheckBox.Behaviors>
</CheckBox>
</ContentPage.Content>
</ContentPage>
為此,我需要將 Path=ViewModel.xxxx 更改為 Path=BindingContext.xxxx 才能正常工作。
不幸的是,該事件會觸發所有檢查,包括數據加載和滾動到視圖中。 不過,這是事件本身的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.