问题描述
我有一个从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>