簡體   English   中英

使用SetBinding的Xamarin.Forms綁定無法正常工作

[英]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的屬性。 有什么明顯的東西我忘記了嗎? 或者我做錯了什么?

由於您不共享FeedbackViewXAML部分,因此我們只能猜測,但讓我們嘗試一下:

你說:

header不綁定到viewmodel的屬性

我很確定(從您共享的代碼中)設置TabItemHeader屬性,即使您的綁定方式是非常規的。 這是問題嗎? 或者你的問題是屏幕上沒有顯示任何內容?

解決“未顯示”問題需要對代碼進行一些更改。 首先,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM