2017-09-14 18 views
0

私はFreshMVVMフレームワークを使用したXamarinアプリケーションを実装していますが、BasePageを使用してPages間でコードを共有したいと考えています。 問題は、MainPage.xamlのいくつかのプロパティをバインドする必要がある場合、ソースをこのように指定して動作させる必要があることです。Text = "{バインディングタイトル、ソース= {x:参照メインページ}} "。そうでない場合ソースバインディングが機能しません。 さて、私はそれを得るが、これは正しい方法ですか?同じ結果を達成する別の方法はありますか?ページにたくさんのバインディングがあるとどうなりますか?例えば、私の意見では、各バインディングの同じソースを設定するのは非常に面倒なので、ソースを上位レベルに設定することは可能ですか?Xamarinフォームのベースページとのバインド

BasePage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="TestXamarin.BasePage" 
      x:Name="basePage"> 
    <ContentView> 
     <StackLayout Orientation="Vertical"> 
      <Label Text="HEADER" FontSize="Large"/> 
      <Label Text="{Binding Text, Source={x:Reference basePage}}" FontSize="Large"/> 
      <ContentPresenter BindingContext="{Binding Parent.BindingContext}" 
           Content="{Binding PageContent, Source={x:Reference basePage}}" /> 
     </StackLayout> 
    </ContentView> 
</ContentPage> 

BasePage.xaml.cs

using Xamarin.Forms; 
 
using Xamarin.Forms.Xaml; 
 

 
namespace TestXamarin 
 
{ 
 
\t [XamlCompilation(XamlCompilationOptions.Compile)] 
 
\t public partial class BasePage : ContentPage 
 
\t { 
 
\t \t public static readonly BindableProperty TextProperty = BindableProperty.Create(
 
\t \t \t nameof(Text), 
 
\t \t \t typeof(string), 
 
\t \t \t typeof(BasePage)); 
 

 
\t \t public string Text 
 
\t \t { 
 
\t \t \t get { return (string)GetValue(TextProperty); } 
 
\t \t \t set { SetValue(TextProperty, value); } 
 
\t \t } 
 

 
\t \t public static readonly BindableProperty PageContentProperty = BindableProperty.Create(
 
\t \t \t nameof(PageContent), 
 
\t \t \t typeof(object), 
 
\t \t \t typeof(BasePage)); 
 

 
\t \t public object PageContent 
 
\t \t { 
 
\t \t \t \t get { return GetValue(PageContentProperty); } 
 
\t \t \t \t set { SetValue(PageContentProperty, value); } 
 
\t \t } 
 

 
\t \t public BasePage() 
 
\t \t { 
 
\t \t \t InitializeComponent(); 
 
\t \t } 
 
\t } 
 
}

MainPage.xamlを

<local:BasePage xmlns="http://xamarin.com/schemas/2014/forms" 
 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
 
       xmlns:local="clr-namespace:TestXamarin" 
 
       x:Class="TestXamarin.MainPage" 
 
       Text="FROM MAIN PAGE" 
 
       x:Name="mainPage"> 
 
    <local:BasePage.PageContent> 
 
     <StackLayout> 
 
      <Label Text="Body" FontSize="Large"/> 
 
      <Label Text="{Binding Title, Source={x:Reference mainPage}}" FontSize="Large"/> 
 
     </StackLayout> 
 
    </local:BasePage.PageContent> 
 
</local:BasePage>
01あなたがやろうとしているものを達成するために

MainPage.xaml.cs

public partial class MainPage : BasePage 
 
\t { 
 
\t \t public MainPage() 
 
\t \t { 
 
\t \t \t Title = "MAIN PAGE"; 
 

 
\t \t \t InitializeComponent(); 
 
\t \t } 
 
\t }

+0

MVVMフレームワークを使用していますか?そうでなければ、私はあなたの拘束力のある経験を大幅に簡素化できるので、あなたにそれを調べるようアドバイスします。 –

+1

'BindingContext'だけが' Source'ではなく、プロパティ値の継承をサポートしています – Ada

+0

@StevenThewissen実際に私はFreshMVVMを使用していますが、同じ問題があるようです。 – user2297037

答えて

3

もう一つの方法は、コントロールテンプレートとなります。

は、ここで私は、コンテンツプレゼンターとTemplateBindingの注意
<ControlTemplate x:Key="ActivityIndicatorTemplate"> 
    <Grid> 
     <ContentPresenter /> 
     <StackLayout Style="{StaticResource BlockingPanel}" 
        IsVisible="{TemplateBinding BindingContext.IsBusy}"> 
      <ActivityIndicator Style="{StaticResource ActivityIndicatorStyle}" 
           IsVisible="{TemplateBinding BindingContext.IsBusy}" 
           IsRunning="{TemplateBinding BindingContext.IsBusy}" /> 
     </StackLayout> 
    </Grid> 
</ControlTemplate> 

App.xaml

でテンプレートを定義しています。

このようなページで使用します。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="Test.MyTestPage" 
      ControlTemplate="{StaticResource ActivityIndicatorTemplate}" 
      Title="{Binding Title}"> 

    <Grid> 
    ... 
    </Grid> 
</ContentPage> 

テンプレートのコンテンツプレゼンターをページコンテンツに置き換えます。基本ページよりもシンプルに見えます。

+0

はい、あなたが提案したものは実用的な解決策であり、現時点では、私はControlTemplateを使用してその問題から逃げ出しています。 このソリューションについて私が気に入らないのは、BasePageのアプローチに対する軽度の柔軟性です。私が知る限り、ControlTemplateにパラメータを渡す唯一の方法は、ViewModelプロパティからのバインディングです。代わりに、Xamlページからパラメータを設定したいと思います。また、BindablePropertyを使用してそれを行うことができます。 – user2297037

関連する問題