创建一个可绑定的标签 属性

Create a tag as a bindable property

是否有可绑定标签 属性 的替代方案? 标签 属性 在 WPF 中可用。但是,它不存在于 Xamarin.Forms.

我想在两个元素之间创建一个可绑定的上下文。 具体来说,我想将标签的 Tag 属性 绑定到条目的 Text 属性.

我尝试了以下操作:

标签属性

public class TagBehavior
{
    public static readonly BindableProperty TagProperty = BindableProperty.CreateAttached<TagBehavior, BindableObject>(
           bindableObject => TagBehavior.GetTag(bindableObject),
           null, /* default value */
           BindingMode.OneWay,
           null,
           (bo, old, @new) => TagBehavior.OnCompletedChanged(bo, old, @new),
           null,
           null);

    public static BindableObject GetTag(BindableObject bindableObject)
    {
        return (BindableObject)bindableObject.GetValue(TagBehavior.TagProperty);
    }

    public static void SetTag(BindableObject bindingObject, BindableObject value)
    {
        bindingObject.SetValue(TagBehavior.TagProperty, value);
    }

    public static void OnCompletedChanged(BindableObject bindableObject, BindableObject oldValue, BindableObject newValue)
    {
        //var tag = TagBehavior.GetTag(entry);

        //if (tag != null)
        //{
        //    Debug.WriteLine("TODO - Handle tag's value change event");
        //}
    }
}

XAML

xmlns:Behaviors="clr-namespace:ViewMenu.Behaviors;assembly=ViewMenu"

。 . .

<Entry x:Name="textBox1" BindingContext="{StaticResource ViewModel}" Text="{Binding Path=Content1}" Grid.Row="0" Grid.Column="0" >
  <Entry.Behaviors>
    <Behaviors:TextBoxFocusBehavior />
  </Entry.Behaviors>
</Entry>

<Label x:Name="label1" Grid.Row="0" Grid.Column="0" 
       Behaviors:TagBehavior.Tag="{Binding Source={x:Reference textBox1}, Path=Text}">
  <Label.Behaviors>
    <Behaviors:LabelDisplayBehavior />
  </Label.Behaviors>
</Label>

但是,我在输出中得到一个错误 window 说:

SetValue: Can not convert to type 'Xamarin.Forms.BindableObject'

有什么建议吗?

您正在创建类型为 BindableObject 的附加 属性,您尝试将其绑定到 TextBox 的 属性 Text,它属于输入 string。显然,string 不能转换为 BindableObject,因此会出现错误。

相反,声明类型为 string 的附加 属性,或者如果您想保持更通用,类型为 object:

public class TagBehavior
{
    public static readonly BindableProperty TagProperty = BindableProperty.CreateAttached<TagBehavior, string>(
           bindableObject => TagBehavior.GetTag(bindableObject),
           null, /* default value */
           BindingMode.OneWay,
           null,
           (bo, old, @new) => TagBehavior.OnCompletedChanged(bo, old, @new),
           null,
           null);

    public static string GetTag(BindableObject bindableObject)
    {
        return (string)bindableObject.GetValue(TagBehavior.TagProperty);
    }

    public static void SetTag(BindableObject bindingObject, string value)
    {
        bindingObject.SetValue(TagBehavior.TagProperty, value);
    }

    public static void OnCompletedChanged(BindableObject bindableObject, string oldValue, string newValue)
    {
        //var tag = TagBehavior.GetTag(entry);

        //if (tag != null)
        //{
        //    Debug.WriteLine("TODO - Handle tag's value change event");
        //}
    }
}