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

2023-12-22

我正在尝试绑定一个附加属性Entry控制它的根父级的属性,它是ContentView: (主要是使用/访问被调用视图的ViewModel(BindingContext)NumBehaviors班级) 应用程序在启动之前就崩溃了,而调试中没有明确的问题点:

由于对象的当前状态,操作无效。

在 D:\a\1\s\Xamarin.Forms.Core\ 中的 Xamarin.Forms.Binding.ApplyRelativeSourceBinding (Xamarin.Forms.BindableObject targetObject, Xamarin.Forms.BindableProperty targetProperty) [0x00041]绑定.cs:153 https://github.com/xamarin/Xamarin.Forms/blob/17881ec93d6b3fb0ee5e1a2be46d7eeadef23529/Xamarin.Forms.Core/Binding.cs#L153

[错误] 致命未处理异常:System.InvalidOperationException:由于对象的当前状态,操作无效。

1-我做错了什么吗(也许是BindingContext)?或者 Xamarin 仍然不能像 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);
}

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

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

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

EDIT

Using Xamarin.Forms 4.8.0.1364

还尝试过AncestorType={x:Type local:MainView}}代替AncestorType={x:Type ContentView}}给出了相同的结果。

也许这与 Xamarin.Forms 的这个开放问题有关[Bug] 使用 AncestorType 时编译的绑定不起作用 #9839 https://github.com/xamarin/Xamarin.Forms/issues/9839


RelativeSource可以找到其祖先的绑定上下文,但行为不在当前可视化树中。

我建议使用它来指示绑定上下文:

Command="{Binding BindingContext.YourCommand, Source={x:Reference PageName}}"

YourCommand必须可以从BindingContext and PageName必须在封闭的属性中设置ContentPage like <ContentPage ... x:Name="PageName"

可以找到更多详细信息here https://forums.xamarin.com/discussion/183883/behavior-crashes-operation-is-not-valid-due-to-the-current-state-of-the-object。向该链接中提供初始解决方案的人表示支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将相对源根父控件的属性绑定到子类的附加属性 - 使应用程序崩溃 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐