【问题标题】:Binding a custom Entry in Xamarin Forms在 Xamarin 表单中绑定自定义条目
【发布时间】:2020-11-03 17:44:10
【问题描述】:

我正在尝试将 Frame 中的此 Entry 提取到 Xamarin 中的自定义元素中,以获得仅在顶部和底部带有边框的可重用 Entry:

<Frame xmlns="..."
       HasShadow="False"
       CornerRadius="0"
       Padding="0, 1, 0, 1"
       BackgroundColor="#c0c0c0">
    <Entry Padding="20, 10, 20, 10"
           Placeholder="{Binding Placeholder}"
           Text="{Binding Text}"
           BackgroundColor="#ffffff" />
</Frame>

代码背后:

public partial class CbSingleEntry : Frame
{
    public static readonly BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(CbSingleEntry));
    public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create("Placeholder", typeof(string), typeof(CbSingleEntry));

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public string Placeholder
    {
        get { return (string)GetValue(PlaceholderProperty); }
        set { SetValue(PlaceholderProperty, value); }
    }

    public CbSingleEntry()
    {
        InitializeComponent();

        BindingContext = this;
    }
}

当我尝试使用此自定义字段时,Placeholder 和 Text 属性已正确设置,但我无法将它们绑定到我的类中的属性:

// this one works fine
<local:CbSingleEntry Placeholder="Company" Text="My Company" />
// Placeholder works, but Text is always empty
<local:CbSingleEntry Placeholder="Company" Text="{Binding Company}" />

我可以确认 Company 有一个值,因为使用普通文本字段它可以正常工作:

// This one works as expected, Text is displayed from binded attribute
<Entry Placeholder="Company" Text="{Binding Company}" />

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms binding


    【解决方案1】:

    原因:在您的情况下,您在 CbSingleEntry 中设置了 BindingContext

    BindingContext = this;
    

    所以 ContentPage 中的绑定将不再起作用。

    解决方案:

    您可以修改CbSingleEntry

    中的代码

    在xml中

    <Frame xmlns="http://xamarin.com/schemas/2014/forms" 
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:d="http://xamarin.com/schemas/2014/forms/design"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 mc:Ignorable="d"
                 
                 x:Name="CustomView"  // set the name here
           
                 x:Class="xxx">
     
           
               <Entry
                 
               Placeholder="{Binding Source={x:Reference CustomView},Path=Placeholder}"
               Text="{Binding Source={x:Reference CustomView},Path=Text}"
               BackgroundColor="#ffffff" />
            
        
    </Frame>
    

    在代码后面

    public partial class CbSingleEntry : Frame
    {
        public static readonly BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(CbSingleEntry));
        public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create("Placeholder", typeof(string), typeof(CbSingleEntry));
    
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
    
        public string Placeholder
        {
            get { return (string)GetValue(PlaceholderProperty); }
            set { SetValue(PlaceholderProperty, value); }
        }
    
        public CbSingleEntry()
        {
            InitializeComponent();
    
           // BindingContext = this; don't need to set it any more
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 2017-11-18
      • 2020-01-02
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多