[英]Xamarin.Forms binding using SetBinding not working
我有基本自定义控件:
public class TabItem : ContentView
{
public TabItem()
{
SetBinding(HeaderProperty, new Binding("Header"));
}
public static readonly BindableProperty HeaderProperty =
BindableProperty.Create("Header", typeof(string), typeof(TabItem), default(string));
public string Header
{
get { return (string)GetValue(TabItem.HeaderProperty); }
set { SetValue(TabItem.HeaderProperty, value); }
}
}
我派生自这个类并设置Binding上下文:
public partial class FeedbackView : TabItem
{
public FeedbackView(FeedbackViewModel viewModel)
{
InitializeComponent();
Content.BindingContext = viewModel;
}
}
这是视图模型:
public class FeedbackViewModel : BaseViewModel
{
private string header;
public FeedbackViewModel()
{
Header = "Test Header";
}
public string Header
{
get { return header; }
set
{
header = value;
OnPropertyChanged("Header");
}
}
当我运行它时 - 标题不绑定到viewmodel的属性。 有什么明显的东西我忘记了吗? 或者我做错了什么?
由于您不共享FeedbackView
的XAML
部分,因此我们只能猜测,但让我们尝试一下:
你说:
header不绑定到viewmodel的属性
我很确定(从您共享的代码中)设置TabItem
的Header
属性,即使您的绑定方式是非常规的。 这是问题吗? 或者你的问题是屏幕上没有显示任何内容?
解决“未显示”问题需要对代码进行一些更改。 首先,在BindableProperty.Create
上设置propertyChanged
arg
public static readonly BindableProperty HeaderProperty =
BindableProperty.Create("Header", typeof(string), typeof(TabItem), default(string),
propertyChanged: OnHeaderChanged);
实现它,并创建一个虚拟方法,以便您可以在子视图中覆盖它
static void OnHeaderChanged (BindableObject bindable, object oldValue, object newvalue)
{
((TabItem)bindable).OnHeaderChanged ((string)oldValue, (string)newValue);
}
protected virtual void OnHeaderChanged (string oldValue, string newValue)
{
}
现在,在派生的FeedbackView
,您可以覆盖OnHeaderChanged
并根据Header
设置标签
protected override void OnHeaderChanged (string oldValue, string newValue)
{
//headerLabel is defined in Xaml, and has a x:Name="headerLabel"
headerLabel.Text = newValue;
}
这应该让你开始。
作为最后一点,我会说在TabItem
ctor中设置Binding是非常规的。 它打破了MVVM模式,因为View(TabItem)对ViewModel的结构做了一些假设(并且存在Header属性)。
该绑定通常在TabItem继承的实例上设置。
var feedback = new FeedbackView (myVm);
feedback.SetBinding (TabItem.HeaderProperty, "Header");
或者,当作为ctor参数传递VM已经破坏 MVVM时,您最终可以在FeedbackView
ctor中执行此操作。
最后一部分是我的拙见。 不要开始热烈的讨论,或者没有我参与:)
您对BindableProperty
实现是错误的。 看看这里如何正确做到: https : //blog.xamarin.com/using-custom-controls-in-xamarin.forms-on-android/
Binding
到属性通常在Page
内完成。 在那里,您将ViewModel
的属性绑定到控件的BindableProperty
。 你不是在控件本身内部做的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.