【问题标题】:Create a tag as a bindable property创建标签作为可绑定属性
【发布时间】:2015-07-16 17:43:24
【问题描述】:

标签可绑定属性是否有替代方案? 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>

但是,我在输出窗口中收到错误消息:

SetValue: 无法转换为类型 'Xamarin.Forms.BindableObject'

有什么建议吗?

【问题讨论】:

  • 您是否尝试过让 TagBehaviour 类从 BindableObject 派生?

标签: data-binding xamarin.forms


【解决方案1】:

您正在创建一个 BindableObject 类型的附加属性,您尝试将其绑定到 TextBox 类型为 string 的属性 Text。显然,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");
        //}
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2017-01-07
    相关资源
    最近更新 更多