在代码中绑定到可绑定的附加属性

Posted

技术标签:

【中文标题】在代码中绑定到可绑定的附加属性【英文标题】:Bind in code to Bindable Attached Property 【发布时间】:2021-07-27 20:35:57 【问题描述】:

来自官方document:

然后在特定控件上设置附加属性时使用命名空间声明,如以下 XAML 代码示例所示:

<Label Text="Label Shadow Effect" local:ShadowEffect.HasShadow="true" />

等效的 C# 代码如以下代码示例所示:

var label = new Label  Text = "Label Shadow Effect" ; ShadowEffect.SetHasShadow (label, true);

我的问题:

以下 XAML 绑定的等效 C# 代码:

<Label Text="Label Shadow Effect" local:ShadowEffect.HasShadow="Binding HasShadow" />

示例场景

我有一个LongPressEffect,它公开了一个附加的可绑定属性Command。效果附在Label上,如下图:

<Label x:Name="LongPressLabel"
       Text="Long press me"
       effects:LongPressEffect.Command = "Binding MyCommand">
   <Label.Effects>
       <effects:LongPressEffect />
   </Label.Effects>
</Label>

如何对 C# 代码进行相同的绑定?

相似主题

似乎与here 提出的问题相同。有什么想法吗?

【问题讨论】:

这能回答你的问题吗? Add DataBinding for attached Property per Code Behind 并非如此。该线程提到的是将属于 TextBox 的属性Text 绑定到附加属性(作为绑定的path 中的附加属性)。我想要的是将附加属性(一个本身不属于元素的属性,在我的 XAML 示例中为Label)绑定到另一个属性。 【参考方案1】:

显然这对我有用:


var label = new Label()

    Text = "Long press me"
;

var longPressedEffect = new LongPressedEffect();
label.Effects.Add(longPressedEffect);

Binding binding = new Binding();
binding.Path = nameof(MyCommand);
binding.Mode = BindingMode.TwoWay;
label.SetBinding(longPressedEffect.CommandProperty, binding);

【讨论】:

【参考方案2】:

根据this document,可以试试下面的代码:

        label1.Effects.Add(new LongPressedEffect());
        LongPressedEffect.SetCommand(label1,mycommand);

C#中的等价标签

   <Label
        x:Name="label1"
        effects:LongPressedEffect.Command="Binding command1"
        effects:LongPressedEffect.CommandParameter="Binding ."
        BackgroundColor="Red"
        Text="Long Press Me!">
        <Label.Effects>
            <effects:LongPressedEffect />
        </Label.Effects>
    </Label>

【讨论】:

在我看来,使用LongPressedEffect.SetCommand(label1,mycommand) 只是为 LongPressedEffect 命令设置了一个静态值,而不是绑定,这会在 mycommand 更改时更改值

以上是关于在代码中绑定到可绑定的附加属性的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 中附加属性的绑定问题

绑定到可观察属性,但显示不可观察的子属性

读 MAUI 源代码 理解可绑定对象和可绑定属性的存储机制

淘汰赛,通过自定义绑定修改时未观察到可观察数组

将多个输入绑定到可观察数组中的同一变量(Knockout.JS)

WPF 附加属性数据绑定