2017-08-19 14 views
1

XamarinFormsとListView Iを使用してiOS/Androidの組み合わせアプリケーションを開発していて、データを入れようとしています。私はこれを実現しようとするリストビュー内のデータテンプレートを使用:リストビューヘッダーデータバインディングが機能しない:Xamarin Formsクロスプラットフォームアプリケーション

<ListView x:Name="listView" Header="{Binding BindPrayUpPointMessage}" SelectedItem="Handle_ItemSelected" ItemTapped="Handle_ItemSelected"> 
    <ListView.Header> 
    <DataTemplate> 
    <StackLayout Padding="10,5,0,5" BackgroundColor="#cccccc"> 
     <Label Text="Welcome, Logixologist" /> 
     <Label Text="{Binding .}" FontSize="Small"/> 
    </StackLayout> 
    </DataTemplate> 
    </ListView.Header> 

私は、基になるデータモデルに値を返しますBindPrayUpPointMessageと呼ばれる性質を持っています。私はリストビューデータテンプレートにメッセージをバインドしています。いくつかのオンラインリソースを使用するが、私は何かが間違っていると思う。ここで

モデルである:私はこれがポイントに設定する必要があり、リストビューのページの背後にあるコードで

public PrayUpNavigationItems() 
     { 

     } 

     public string MainPages { get; set; } 
     public string CategoryPages { get; set; } 
     public static string BindPrayUpPointMessage { get { return PrayUpPointsMessage; } } 
     public static string PrayUpPointsMessage; 

:私はそれを実行すると

PrayUpPoints = 1765; 
     prayupapp.PrayUpNavigationItems.PrayUpPointsMessage = "Total PrayUpPoints: " + PrayUpPoints.ToString(); 

を、ヘッダルックスこのような:

Android Version

iOS Version

文字列をListViewのヘッダーに正しくバインドするにはどうすればよいですか。

答えて

1

私はこの方法で最初にすべてのそれを行うヘッダータグを削除し、直接BindPrayUpPointMessageでラベルを結合します。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="stackoverflow.YourPage" xmlns:vm="clr-namespace:stackoverflow;"> 
<ContentPage.BindingContext> 
    <vm:YourViewModel/> 
</ContentPage.BindingContext> 
<ListView x:Name="listView" SelectedItem="Handle_ItemSelected"> 
<ListView.Header> 
    <StackLayout Padding="10,5,0,5" BackgroundColor="#cccccc"> 
     <Label Text="Welcome, Logixologist" /> 
     <Label Text="{Binding BindPrayUpPointMessage}" FontSize="Small"/> 
    </StackLayout>    
</ListView.Header> 
</ListView> 

今のコードビハインドあなたに

public class YourViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    string bindPrayUpPointMessage; 
    public string BindPrayUpPointMessage 
    { 
     get { return bindPrayUpPointMessage; } 
     set 
     { 
      bindPrayUpPointMessage = value; 

      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(BindPrayUpPointMessage))); 
     } 
    } 
} 

を変更しましたBindPrayUpPointMessageあなたの財産を直接BindPrayUpPointMessageを設定することができ、あなたの見解を教えてください。

public partial class YourPage : ContentPage 
{ 
    public YourPage() 
    { 
     InitializeComponent(); 
     var ViewModel = new YourViewModel(); 
     BindingContext = ViewModel; 

     var PrayUpPoints = 1765; 
     ViewModel.BindPrayUpPointMessage = "Total PrayUpPoints: " + PrayUpPoints.ToString(); 
    } 
} 
+0

したがって、ポイントの合計を別のページに更新した場合、データを更新するには、どのようにPropertyChangedイベントを発生させることができますか?または、別の方法でリフレッシュする必要があります。私はいくつかのコードを 'protected override void OnAppearing()'に追加したいと考えています。 – logixologist

+0

これは完全に異なる質問のようです。この回答に回答し、新しいものを開きます。また、mvvmパターンの使用を検討してください。それは、短い言葉で、可能な限り愚かな見解を残そうとしていることを意味します!しかし、後でもっと! –

0

だけDataTemplateタグを削除し、

<ListView x:Name="listView"SelectedItem="Handle_ItemSelected" ItemTapped="Handle_ItemSelected"> 
    <ListView.Header> 
     <StackLayout Padding="10,5,0,5" BackgroundColor="#cccccc"> 
      <Label Text="Welcome, Logixologist" /> 
      <Label Text="{Binding PrayUpPointsMessage}" FontSize="Small"/> 
     </StackLayout> 
    </ListView.Header> 
</ListView> 

を行ってもいいです。また、私はラベルに直接PrayUpPointsMessageを結合しています注意してください。

UPDATE:あなたが唯一のイベントPropertyChangedで構成さとINotifyPropertyChangedインタフェースを実装する必要が見ることができるように

public class PrayUpNavigationItems : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string MainPages { get; set; } 
    public string CategoryPages { get; set; } 

    private string prayUpPointsMessage; 
    public string PrayUpPointsMessage 
    { 
     get 
     { 
      return prayUpPointsMessage; 
     } 
     set 
     { 
      prayUpPointsMessage = value; 
      RaisePropertyChanged(nameof(PrayUpPointsMessage)); 
     } 
    } 

    private void RaisePropertyChanged([CallerMemberName] string propertyName="") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public PrayUpNavigationItems() 
    { 
    } 
} 

あなたPrayUpNavigationItemsクラスは、このようなものに更新する必要があります。これは、プロパティ値が変更されるたびに呼び出される必要があります。これは、UIにそのような変更が通知されるようにする場合にのみ必要です。上記の例では、PrayUpPointsMessageの変更のみが通知されます。同じプロパティを別のプロパティにも必要とする場合は、同じパターンに従わなければなりません。あなたがそうあなたが実際に値を割り当てることができるように背後にあるあなたのXAMLコードで作成し、インスタンスする必要がありますPropertyChangedにアクセスするには、クラスのインスタンスを必要とするので、プロパティはstaticこのとしてマークすることはできません

お知らせです。クラスを見てみると

var PrayUpPoints = 1765; 

var prayUpNavigationItems = new PrayUpNavigationItems(); 
prayUpNavigationItems.PrayUpPointsMessage = $"Total PrayUpPoints: {PrayUpPoints}"; 

私はまた、あなたは、もはやBindPrayUpPointMessageプロパティを必要としないだろうとPrayUpPointsMessageに直接結合が仕事をする必要があります注意してください。本当に必要な場合は、通知を実装するだけです。

・ホープ、このhelps.-

+0

ありがとうございました。それが私が最初に試したことでした。直接その文字列にバインドすると何も返されません。静的ラベルは表示されますが、バインディングは表示されません。 – logixologist

+0

@logixologist更新する必要があるため、更新する必要はありません。あなたのViewModelをバインドする際には、 'PrayUpNavigationItems'がI'NotifyPropertyChanged'インターフェースを実装し、変更をUIに通知する必要があります。私の元の答えを更新する。 – apineda

関連する問題