[英]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.