仅当我不使用 BindingContext 时,Xamarin BindableProperty 才适用于绑定

2024-01-04

在 Xamarin Forms 中,我创建了一个页面,其中包含一个自定义组件,我想为其提供一个值,如下所示:

<c:CustomComponent Test="{Binding Test}" />

然而,这是行不通的。当我使用原始数字而不是绑定时,它可以工作。我发现的问题是,我的自定义组件使用了 ViewModel / BindingContext。因此,当我删除将 ViewModel 分配给 BindingContext 的行时,绑定就会起作用。

为什么会这样?如何在自定义组件中同时使用 BindingContext 和 BindableProperty?或者我必须在后面的代码中完成所有操作吗?

作为参考,我如何创建 BindableProperty 的一些代码示例

public static readonly BindableProperty TestProperty = BindableProperty.Create(nameof(Test), typeof(int),
    typeof(CustomComponent), propertyChanged: (bindable, oldVal, newVal) => {
        Debug.WriteLine("TEST " + newVal);
    });

public int Test {
    get => (int)GetValue(TestProperty);
    set => SetValue(TestProperty, value);
}

“我的自定义组件使用了 ViewModel / BindingContext。”

如果它是“独立的”,则创建可重用的自定义组件会更容易 - 没有 BindingContext。

构造函数:

public CustomComponent()
{
    InitializeComponent();
}

将组件视图模型中当前拥有的所有内容移至 xaml.cs 代码隐藏文件中。

现在在 CustomComponent.xaml 中,为其命名(此处theComponent):

<ContentView ...
 x:Name="theComponent"
 x:Class=...>

当组件的 xaml 想要绑定到其自身的属性时,这会派上用场:

<Label Text="{Binding TestString, Source={x:Reference theComponent}}" />
public string TestString
{
    get => _testString;
    set {
        _testString = value;
        OnPropertyChanged();
    }
}
private string _testString = "test";

tl;dr:如果组件有一个x:Name="theComponent"在它的xaml中,可以使用{Binding ..., Source={x:Reference theComponent}},来引用它自己的属性。不需要 BindingContext。


如果您希望组件具有关联的 ViewModel,则使用上述技术,您不必将 BindingContext 设置为该 VM。像这样做:

public class MyViewModel
{
    public string TestString
    {
        get => _testString;
        set {
            _testString = value;
            OnPropertyChanged();
        }
    }
    private string _testString = "test";
}

自定义组件:

public MyViewModel VM { get; private set; }
public CustomComponent()
{
    InitializeComponent();
    VM = new MyViewModel();
}

在xaml中的用法:

<Label Text="{Binding VM.TestString, Source={x:Reference theComponent}}" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当我不使用 BindingContext 时,Xamarin BindableProperty 才适用于绑定 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • C# 中控制台的最大列数

    在 C 控制台应用程序中 我发现您可以使用Console SetWindowSize 160 80 设置控制台窗口的大小 这很棒 除了最大行数和列数完全取决于个人计算机的显示分辨率这一事实之外 你打电话时Console SetWindowS
  • 与其他应用程序共享图像

    这是我的问题 我想分享一张 png 图像 我有可绘制和资产中的图像 当我使用共享意图时 它可以工作 但不是以我想要的方式 共享的文件显示为数字且不带扩展名 并且某些应用程序会发送消息 未知文件 我能做些什么 这是我的代码 Uri uri U
  • UITableView 代表的超类?

    一个简单的问题 我正在为 UITableView 设置委托 并且有一个关于设置委托和 dataSource 属性的问题 我注意到委托和数据源的属性不可用 我认为采用协议将使它们可用 但我现在认为我的委托类的超类可能是错误的 目前我有 voi
  • 找出php文件类型

    请告诉我如何检查文件的真实类型 当执行imagecreatefrompng 函数 它显示错误 is not a valid PNG file mime content type says image png file
  • 如果最终删除/插入数组的时间复杂度相等,为什么要使用链表?

    我有以下问题 如果删除数组元素的时间复杂度是 O n 并且链表 给定索引 的时间复杂度也是 O n 因为我还需要搜索整个列表 为什么要使用链表 虽然渐近复杂度可能相同 但常数因子可能非常不同 特别是 您可能拥有一组 大 的东西 移动或复制的
  • C# 如何将字符串转换为唯一ID

    假设我们有 string name stackoverflow com 如何将此字符串 int 转换为唯一 ID 或某种哈希值 没有md5 因为它太大 并且它不应该是随机的 我想要这样的东西 请注意字符串本身太大我想知道字符串是否可以写得更
  • Oracle SQL:使用 regexp_substr 返回字符串的第一行

    我试图从 SQL 查询 oracle 11 中的文本框中返回第一行文本 文本框的内容如下所示 X WITHDRAWN Explanation 我想返回顶行 即 X 撤回 我不确定是否可以指定仅查看第一行 或者仅返回回车符之前的所有文本 两者
  • 每次在 vim 中编辑后保存文件

    我经常在 vim 中执行此操作 在插入或正常模式下执行某些操作 Esc ws 我每天都会这样做数百次 相反 我想放弃这个习惯 并在对缓冲区进行任何更改后立即将 vim 保存到文件 一切都在 SSD 上运行 所以我不认为性能会成为问题 将这个
  • initKeyboardEvent 的基本示例

    I m trying to find a basic example of the use of initKeyboardEvent Ideally I want to create a keyboard event where when
  • 在 Angular2 中构建包装器指令(包装一些内容/组件)

    我对 Angular2 的构建指令非常新 我想要的是创建一个弹出指令 它将用一些 css 类包装内容 Content 内容可以是纯文本和标题 例如 div class data h2 Header h2 Content to be plac
  • PHP 中的 UTF-8 字符乱码

    我有要
  • 使用 Javascript 下载文件

    我希望用户能够从我的服务器下载这个 Excel 文件 单击 下载 按钮后必须有一种简单的方法来启动文件的下载 但我不知道如何实现这一点 到目前为止我已经有了 VBscript 和 ASP Set fs Server CreateObject
  • 有没有办法获取Z3中的默认上下文?

    我正在使用 z3py API 4 3 0 我可以轻松翻译一个表达expr从默认上下文到新上下文target ctx using expr translate target ctx 但是我如何从给定的上下文中进行翻译ctx进入默认的 Z3 上
  • 如何以编程方式检查 Android 中是否安装了应用程序?

    我们已经以编程方式安装了应用程序 如果设备中已安装该应用程序 则该应用程序会自动打开 否则安装特定的应用程序 引导我 我不知道 谢谢 尝试用这个 public class MainActivity extends AppCompatActi
  • 如何计算两个日期之间的网络日减去假期

    我想了解如何应用像这样的函数NETWORKDAYS https support office com en us article NETWORKDAYS function 48e717bf a7a3 495f 969e 5005e3eb18
  • 如何使用 PHP 重定向到另一个页面[重复]

    这个问题在这里已经有答案了 我正在建立一个包含登录页面的网站 我需要在用户成功登录后将其重定向到他们的个人资料页面 但我不知道如何在 PHP 中执行此操作 这是我的第一个网站 我在互联网上搜索过并被告知header 函数应该可以解决问题 但
  • 如何更改 Bootstrap 5 导航栏按钮边框和图标颜色?

    我需要在 Bootstrap 5 导航栏菜单按钮上使用自定义颜色 760822
  • 在具有不同实例数量的特定列上合并两个不同长度的数据帧

    我有两个数据框 D1 和 D2 两者的大小不同 但有一定的关系 D1 的 ID 列具有相同 ID 的多个实例 而 D2 仅具有单个实例 那么如何将这两个数据帧连接在一起呢 D1 D2 ID val1 val2 ID Target 1 x y
  • Python 在二进制文件中搜索和替换

    我正在尝试搜索并替换此 pdf 表单文件 header fdf 我认为这被视为二进制文件 中的一些文本 例如 Smith John FDF 1 2 n xe2 xe3 xcf xd3 n1 0 obj n lt Fields lt T Pa
  • 仅当我不使用 BindingContext 时,Xamarin BindableProperty 才适用于绑定

    在 Xamarin Forms 中 我创建了一个页面 其中包含一个自定义组件 我想为其提供一个值 如下所示