gpt4 book ai didi

c# - 将相对源根父控件的属性绑定(bind)到子类的附加属性 - 使应用程序崩溃

转载 作者:行者123 更新时间:2023-12-03 10:12:57 28 4
gpt4 key购买 nike

我正在尝试将 Entry 控件的附加属性绑定(bind)到它的根父控件的属性,即 ContentView:(主要是使用/访问NumBehaviors类中被调用 View 的ViewModel(BindingContext))应用程序甚至在启动之前就崩溃了,调试中没有明确的问题点:

Operation is not valid due to the current state of the object.

At Xamarin.Forms.Binding.ApplyRelativeSourceBinding (Xamarin.Forms.BindableObject targetObject, Xamarin.Forms.BindableProperty targetProperty) [0x00041] in D:\a\1\s\Xamarin.Forms.Core\ Binding.cs:153

[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidOperationException: Operation is not valid due to the current state of the object.

1- 我是不是做错了什么(可能是 BindingContext)?还是 Xamarin 处理绑定(bind)的能力仍不如 wpf(比如缺少 ElementName)?

2- 为什么调试错误/异常不那么明确?

MainView.xaml:

<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:Helpers="clr-namespace:App.Helpers"
xmlns:Behaviors="clr-namespace:App.Behaviors"
HorizontalOptions="FillAndExpand"
VerticalOptions="Center"
x:Class="App.Views.MainView">

<Entry>
<Entry.Behaviors>
<Behaviors:NumBehaviors Helpers:HelperClass.Vm=
"{Binding Source={RelativeSource AncestorType={x:Type ContentView}}, Path=VM}"/>
</Entry.Behaviors>
</Entry>

HelperClass.cs

public static BindableProperty VmProperty = 
BindableProperty.Create("Vm", typeof(object), typeof(HelperClass), null);

public static object GetVm(BindableObject bindable)
{
return (object)bindable.GetValue(VmProperty);
}

public static void SetVm(BindableObject bindable, object value)
{
bindable.SetValue(VmProperty, value);
}

MainView.cs

public object VM {get; set;}

public MainView()
{
InitializeComponent();
VM = (object) new MyViewModel();
BindingContext = VM;
}

NumBehaviors.cs

...
void OnEntryTextChanged(object sender, TextChangedEventArgs args) {
var usedvm = HelperClass.GetVm((BindableObject)sender);
}

我也许可以使用以下内容,但我认为这是个坏主意,当 EntryBindingContext 与它的根父级不同时,它是无用的它看起来不灵活:

...
void OnEntryTextChanged(object sender, TextChangedEventArgs args) {
var usedvm = ((Entry)sender).BindingContext;
}

附言:也许我的方法不好,我愿意接受更好的方法来实现这一目标。

编辑

使用 Xamarin.Forms 4.8.0.1364

还尝试使用 AncestorType={x:Type local:MainView}} 而不是 AncestorType={x:Type ContentView}} 给出了相同的结果。

可能与 Xamarin.Forms 的这个开放问题有关 [Bug] Compiled bindings not working when using AncestorType #9839

最佳答案

避免此问题的另一种解决方案是通过移动 <Entry.Behaviors:NumBehaviors> 中的附加属性来更改设计。至 <Entry> :

<Entry Helpers:HelperClass.Vm="{Binding Source={RelativeSource AncestorType={x:Type ContentView}},
Path=VM}">
<Entry.Behaviors>
<Behaviors:NumBehaviors/>
</Entry.Behaviors>
</Entry>

此举还将修复我在问题代码中犯的错误,我附加了属性 Vm到对象 <Entry.Behaviors:NumBehaviors>当我试图从对象 Sender(=Entry) 中获取它时( var usedvm = HelperClass.GetVm((BindableObject)sender); ) 总是返回 null .

关于c# - 将相对源根父控件的属性绑定(bind)到子类的附加属性 - 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63749594/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com