微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何向消费者隐藏Xamarin Forms自定义控件中的属性 ViewModel 页面自定义控件

如何解决如何向消费者隐藏Xamarin Forms自定义控件中的属性 ViewModel 页面自定义控件

我有一个从StackLayout派生的自定义控件,其中包含两个Label。每个Label的Text属性都绑定到背后代码中的一个属性

public string Label1Text
{
    get { return _label1Text; }
    set
    {
        _label1Text = value;
        OnPropertyChanged(nameof(Label1Text));
    }
}

标签的文本内容由控件的使用者设置的背后代码中单独的BindableProperty的内容确定,因此,标签的绑定属性自定义控件之外不应真正可见

如果我在代码的后面将属性设置为私有,则控件Xaml中的绑定将不起作用。但是,当设置为public时,它们在Intellisense中可见,这是错误的,因为它们仅供内部使用。

我可以设置属性

[browsable(false),Editorbrowsable(EditorbrowsableState.Never)]

关于属性,但这是处理此问题的正确方法,因为它仅隐藏了属性,实际上并未阻止控件的使用者设置它们?

解决方法

您可以直接在Label.Text和viewmodel的属性之间创建绑定。

并定义私有属性,仅供内部在自定义控件中使用。

ViewModel

public class Model
{
    public string TextA { get; set; }
    public string TextB { get; set; }
}

页面

//code behind
public Page2()
    {
        InitializeComponent();

        Model model = new Model
        {
            TextA = "ABCD",TextB = "1234"
        };

        this.BindingContext = model;
    }

//xaml
<ContentPage.Content>
    <local:MyStack />
</ContentPage.Content>

自定义控件

 //code behind
 public partial class MyStack : ContentView
    {
        private string A { get; set; }   //internal use 
        private string B { get; set; }   //internal use 
        public MyStack()
        {
            InitializeComponent();
            this.BindingContextChanged += MyStack_BindingContextChanged;
        }

        private void MyStack_BindingContextChanged(object sender,EventArgs e)
        {
            var model = this.BindingContext as Model;

            A = model.TextA;
            B = model.TextB;
        }
    }

//xaml
 <ContentView.Content>
        <StackLayout>
            <Label Text="{Binding A}" TextColor="Red"/>
            <Label  Text="{Binding B}" TextColor="Green"/>
        </StackLayout>
  </ContentView.Content>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。