在代码中绑定到可绑定的附加属性
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 更改时更改值以上是关于在代码中绑定到可绑定的附加属性的主要内容,如果未能解决你的问题,请参考以下文章