You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中以编程方式实现Uno绑定?示例代码无法运行求助

在C#中编程实现Uno x:Bind绑定的修正方案

你提供的官方示例代码存在几个需要调整的细节,以下是可运行的修正版本及关键说明:

1. 修正后的核心代码

// 假设c18是你的TextBlock实例
c18.SetBinding(
    TextBlock.TextProperty, 
    new Binding
    { 
        Mode = BindingMode.OneWay,
    }
    .Apply(binding => 
        BindingHelper.SetBindingXBindProvider(
            binding, 
            this, // 绑定的数据源上下文
            ctx => ((YourViewModelType)ctx).InstanceDP + ((YourViewModelType)ctx).MyxBindClassInstance.MyIntProperty, // 替换为实际业务逻辑
            new [] { "InstanceDP", "MyxBindClassInstance.MyIntProperty" } // 要监听的属性路径
        )
    )
);

2. 关键修正点

  • 替换占位符方法:示例中的Add是占位逻辑,需替换为和目标属性类型匹配的实际代码(比如数值转字符串、属性值拼接等)。
  • 明确上下文类型:ctx参数是数据源实例,必须强制转换为对应的ViewModel类型,避免编译错误。
  • 确保属性支持通知:InstanceDP和MyxBindClassInstance.MyIntProperty必须是公开属性,且所属类实现INotifyPropertyChanged接口,否则属性变化时UI不会自动刷新。
  • 简化命名空间:提前引入using Windows.UI.Xaml.Data;和using Uno.UI.Xaml;,可省略全局命名空间前缀,让代码更简洁。

3. 完整可运行示例

先定义实现通知接口的ViewModel:

public class MyViewModel : INotifyPropertyChanged
{
    private int _instanceDP;
    public int InstanceDP
    {
        get => _instanceDP;
        set
        {
            _instanceDP = value;
            OnPropertyChanged();
        }
    }

    public MyxBindClass MyxBindClassInstance { get; set; } = new MyxBindClass();

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class MyxBindClass : INotifyPropertyChanged
{
    private int _myIntProperty;
    public int MyIntProperty
    {
        get => _myIntProperty;
        set
        {
            _myIntProperty = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在页面/控件中设置绑定:

using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
using Uno.UI.Xaml;
using System.ComponentModel;
using System.Runtime.CompilerServices;

// 假设页面DataContext已设置为MyViewModel实例
var viewModel = (MyViewModel)DataContext;
var c18 = new TextBlock();

c18.SetBinding(
    TextBlock.TextProperty,
    new Binding
    {
        Mode = BindingMode.OneWay,
    }
    .Apply(binding =>
        BindingHelper.SetBindingXBindProvider(
            binding,
            viewModel,
            ctx => $"计算结果:{ctx.InstanceDP + ctx.MyxBindClassInstance.MyIntProperty}",
            new[] { "InstanceDP", "MyxBindClassInstance.MyIntProperty" }
        )
    )
);

// 将TextBlock添加到可视化树
this.Content = c18;

4. 常见排查要点

  • 版本兼容性:确保使用的Uno.UI版本与文档匹配,旧版本可能不支持SetBindingXBindProvider方法,建议升级到最新稳定版。
  • 数据源上下文正确:SetBindingXBindProvider的第二个参数必须是实际的数据源实例,不要随意传this(除非当前页面/控件本身就是数据源)。
  • 属性路径准确:监听的属性路径要与数据源中的属性名称完全一致,嵌套属性用.分隔,格式不能出错。

内容的提问来源于stack exchange,提问作者Ray Hsieh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:52:40