我需要在选中/取消选中复选框后运行一个命令。复选框通过StackLayout的项目源在页面中呈现,EventToCommandBehavior来自MAUI CommunityToolkit。
当应该呈现页面时(最有可能是在分析和处理XAML时)会引发异常。异常消息如下:“由于对象的当前状态,操作无效。",这不是很有帮助(我缺少什么状态,谁是所有者,什么是无效的)。
也许打个电话能帮上忙?
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。内容页面和视图模型被正确地创建(构造函数传递),但是稍后某个地方抛出了异常,老实说不知道为什么。
<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();
}
}
这是页面视图模型
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");
}
}
1条答案
按热度按时间xpcnnkqh1#
经过一些研究,我发现行为不是可视化树的一部分(对不起,链接丢失了)。
为了克服这个问题,必须通过引用来引用源绑定,请参见**“This”**,它引用了内容页面的
x:Name
。ViewModel
只是ContentPage
的一个强类型属性,它引用了未装箱的BindingContext
。旁注:这个问题涉及到.NET MAUI,但是,我不得不迁移回Xamarin Forms,因为当时.NET MAUI有很多bug,阻碍了开发和应用程序发布。两个框架的问题是相同的。