2017-01-30 22 views
1

私はユーザーがアプリケーションを使用している間にオーディオファイルを再生するXamarin.Formsモバイルアプリケーションを構築しています。ユーザーはファイルの再生を開始した後も引き続きアプリケーションを使用することができ、ファイルは単一のビューではなく静的なクラスを使用して再生/管理されます(そのビューはナビゲーションスタックから削除される可能性がありますまだ演奏されている)。Xamarin - ControlTemplateの静的クラスへのバインド

私は、アプリケーション内の他のビューに表示されるミニプレーヤーを持ちたいと思います。これを達成するためにControlTemplateを使用しています。このコントロールテンプレートには、スタティッククラス内のプロパティ(プレーヤの状態[再生/一時停止]、残り時間、タイトルなど)にバインドされているアイテムや、静的クラスでメソッドを実行するコントロールを持たせたい。私はapp.xamlページ(ControlTemplateのある場所)のコードの背後にあるメソッドを使用してメソッドを実行できますが、バインド可能なプロパティをバインドするのは苦労しています。

今私は、IsToggledがバインド可能なプロパティにバインドされているはずのトグルを持っています。IsPlayingは静的クラスのバインド可能なプロパティにバインドされています。

私は下のエラーを取得し続ける:私は何が起こっているか分からないので、私はすべての私の.xamlでXMLNSで名前空間を定義している

Xamarin.Forms.Xaml.XamlParseException: Type AudioPlayer.Current not found in 
xmlns clr-namespace:AudioPlayerBar;assembly=AudioPlayerBar... 

<ControlTemplate x:Key="PlayerPageTemplate"> 
      <StackLayout VerticalOptions="FillAndExpand"> 
       <ContentView VerticalOptions="FillAndExpand"> 
        <ContentPresenter /> 
       </ContentView> 
       <StackLayout x:Name="stackFooterContent"> 
        <Label Text="IsPlaying Value:"/> 
        <Switch IsToggled="{x:Static local:AudioPlayer.Current.IsPlaying}" /> 
        <Button Text="Toggle IsPlaying" Clicked="Click_PlayPause" /> 
       </StackLayout> 
      </StackLayout> 
     </ControlTemplate> 

任意の考え

using System; 
using System.ComponentModel; 
using Xamarin.Forms; 

namespace AudioPlayerBar 
{ 
public class AudioPlayer :INotifyPropertyChanged 
{ 
    // Singleton for use throughout the app 
    public static AudioPlayer Current = new AudioPlayer(); 

    //Don't allow creation of the class elsewhere in the app. 
    private AudioPlayer() 
    { 
    } 

    private bool _IsPlaying = false; 

    //property for whether a file is being played or not 
    public bool IsPlaying 
    { 
     get 
     { 
      return _IsPlaying; 
     } 
     set 
     { 
      _IsPlaying = value; 
      OnPropertyChanged("IsPlaying"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged == null) 
      return; 

     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
} 

そして、ここでは(app.xaml内の)私のControlTemplateです:私のプロジェクト全体は、ここでhttps://github.com/ChetCromer/XamarinPrototypes/tree/master/AudioPlayerBar

でGitHubの上にある私の静的なクラスですか?私はXamarinの中で拘束するのは初めてだと認めますが、私が読んでいることは、ContentPagesにもっと応用しているようで、ControlTemplatesとは異なっているようです。

+0

明確にするために、これは実際に静的なクラスではなく、静的なクラスのインスタンスです。静的クラスへのバインドも試しましたが、INotifyPropertyChangedを継承することができないため、移動する方法のようには見えません。 –

答えて

1

私はここで例を使用してこの作業を得た:Binding to a property within a static class instance

それはので、私は私の質問を残して、それを答えるよ全く同じ問題ではありません。

私は上記の答えを一致させるために、私のクラスを変更しましたが、大きな変化は、バインディングコードがXAMLでどのように見えるかです:

//New 2 way bindable property I made up 
<Label Text="{Binding Source={x:Static local:AudioPlayer.Instance},Path=Title}"/> 

//Boolean bindable property 
<Switch IsToggled="{Binding Source={x:Static local:AudioPlayer.Instance},Path=IsPlaying}" /> 

「パス」とは大きな違いであると考えられます。私はこれがちょうど今ポップアップとしてこれ以上いくつかを読んでいるだろうと思う。

関連する問題