2017-12-15 5 views
0

100sスイッチボックスから100sのトグルアクションをキャプチャし、覚えておく必要があります(XAMARINで)。私はアプリケーションをロードする正味の時間ので、各スイッチボックスの状態を記憶しています。私がこれまでに作成したものはカスタムのBindablePropertyです。そのため、繰り返し使用できます。Handel XAMARINの複数のスイッチボタン

public static readonly BindableProperty LabelProperty =BindableProperty.Create("Label", typeof(string), typeof(CustomSwitchCell)); 
    public string Label 
    { 
     get 
     { 
      return (string)GetValue(LabelProperty); 
     } 
     set 
     { 
      SetValue(LabelProperty, value); 
     } 
    } 

そして、XAMLファイルに

<Label Text="{Binding Label}" IsVisible="True" Grid.Row="0" Grid.Column="0" HorizontalOptions="StartAndExpand" /> 
    <Switch x:Name="SwitchName" IsToggled="{Binding ItemSwitch}" Toggled="OnFavoriteClicked" Grid.Row="0" Grid.Column="1" HorizontalOptions="EndAndExpand" /> 

今、私は

<switch:CustomSwitchCell Label="Item1" /> 
<switch:CustomSwitchCell Label="Item2"/> 
<switch:CustomSwitchCell Label="Item3"/> 
<switch:CustomSwitchCell Label="Item4"/> 

ように私のメインページにカスタムセルを使用し、今では複数作成されます。 これは私がこれまでにやっていることですLableのスイッチボタンについては触れましたが、どうやって入手するのか分かりません

Toggled =それぞれ "OnFavoriteClicked"です。 他にもたくさんの機能を作成せずに複数のトグルアクションを取得して保存し、ページを読み込むときに簡単にロードできますか?これは明確 希望は...あなたがsqlliteのようなローカルDBを必要としています..私はXAMARINに新しい蜂午前.. おかげで、 MKJ

答えて

0

を案内してください。私はSQLite.Net.Core-PCLナゲットを使用しています。

public static class MyEnums 
{ 
    On = 1, 
    Off = 2, 
    Unselected = 3 
} 

今後の参考のために、各トグルスイッチを識別するためのいくつかの方法で、私は、彼らがIDを持つと仮定しています。

private static void OnSelectedItemChanged(BindableObject bindable, object oldvalue, object newvalue) 
{ 
    if(oldvalue != newvalue) 
    { 
     var existingmodel = Model_MySwitchWidget.GetByID(this.switchID); 
     if(exstingmodel == null) 
     { 
       var newswitch = new Model_MySwitchWidget(); 
       newswitch.selectionStatus = newvalue; 
       newswitch.switchID = this.switchID; 
       newswitch.switchText = this.switchText; 
       newswitch.InsertItem();    

     } 
     else 
     { 
      existingmodel.selectionStatus = newvalue; 
      existingmodel.UpdateItem(); 
     } 
    } 

(あなたのスイッチインサイド)

public class Model_MySwitchWidget 
{ 
    [Table("mySwitchWidget")] 

    [PrimaryKey, NotNull] 
    private int switchID; 
    private int selectionStatus;  
    private int switchText; 

    public static GetAll() 
    { 
     using(var db = DependencyService.Get<ISQLite>().GetConnection()) 
     { 
      return new ObservableCollection<Model_Model_MySwitchWidget>(db.Table<Model_MySwitchWidget>().ToList()); 
     } 

    } 

public static GetByID(int searchedSwitchID) 
{ 
    using(var db = DependencyService.Get<ISQLite>().GetConnection()) 
     { 
      List<Model_MySwitchWidget> switches = 
      db.Query<ModelMySwitchWidget>("Select * FROM mySwitchWidget 
      Where switchID = ?", searchedSwitchID); 
      return switches[0]; 
     } 
} 

    public void InsertItem() 
    { 

     using (var db = DependencyService.Get<ISQLite>().GetConnection()) 
      { 
       db.Insert(this); 
      } 
    } 

    public void UpdateItem() 
    { 
     using (var db = DependencyService.Get<ISQLite>().GetConnection()) 
      { 
       db.Update(this); 
      } 
    } 
} 

今、あなたはあなたのページ、または任意のviewmodelだけ

var mycollectionofswitches = new ObservableCollection<Model_MySwitchWidget>(Model.MySwitchWidget.GetAll()); 

をロードし、保存したスイッチの集合を持っている場合。

要件: James Montemango Settings Plugin あなたはまた、DBを使用することができますが、私は設定プラグインは、より速くその軽量かつ保守が容易に実装されていると思います

+0

DBを使用すると、非常に多くの列(項目ごとに1つ)が返されます。 – user1497086

+0

スイッチあたり1行* –

+0

ありがとう、私は将来、100s以上のアイテムが存在する可能性があるため、DBにトグル状態を保存することを排除できるアプローチに取り組んでいます。 – user1497086

0

私のアプローチは、次のようになります。ネイティブプラットフォームツールを使用して、永続データをデバイスに保存します。そして、設定プラグインのみ(などint型、ブール値、文字列、)プリミティブ型を格納できるよう、文字列の中に複雑なモデルをシリアル化する素敵なJSONシリアライザ、 NewtonSoft JSon Serializer

INotifyPropertyChanged Interfaceから継承モデルクラスを作成します。 各スイッチセルは、バインディングコンテキストとして1つのモデルを持ちます。

public class YourModel : INotifyPropertyChanged 
{ 
    private string labelText; 
    private bool switchIsToggled; 

    public string LabelText 
    { 
     get { return labelText; } 
     set 
     { 
      labelText = value; 
      OnPropertyChanged(); 
     } 
    } 

    public bool SwitchIsToggled 
    { 
     get { return switchIsToggled; } 
     set 
     { 
      switchIsToggled = value; 
      OnPropertyChanged(); 
     } 
    } 
} 
  • ViewModel
  • は公共アレイ、IListの、あるいは今ViewModel

にあなたのページのバインディング・コンテキストを設定しViewModel

  • YourModelののObservableCollectionを作成します2つの方法があります:ListViewを簡単に作成し、YourModelのコレクションをに割り当てることができますリストビューの。 あなたViewModelは、コレクションを作成するとき、それはそれを反復処理し、各SwitchIsToggledブールを購読することができます:あなたがスクロール可能なリストを持っているしたくない場合は、その後、私はページ上でこの方法を試してみます

    foreach(YourModel switchModel in YourModelList) 
    { 
        switchModel.PropertyChanged += Switch_PropertyChanged; 
    } 
    
    private void Switch_PropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
        if(sender is YourModel yourModel && args.PropertyName == SwitchIsToggled) 
        { 
         //code that should be called when switch was toggled 
        } 
    } 
    

    public class YourPage : ContentPage 
    { 
    
        public YourPage() 
        { 
         BindingContext = YourViewModel; 
        } 
    
        protected override OnBindingContextChanged 
        { 
         if(BindingContext is YourViewModel vm) 
         { 
          var stackLayout = new StackLayout(); 
          foreach(var yourModel in vm.YourModelList) 
          { 
           stackLayout.Children.Add(new CustomSwitchCell() { BindingContext = yourModel; } 
    
           //or with event (not suggested, stick to MVVM!) 
           //var newCustomSwitchCell = new CustomSwitchCell() { BindingContext = yourModel } 
           //newCustomSwitchCell.Toggled += YourToggledEvent; 
           //stackLayout.Children.Add(newCustomSwitchCell); 
          } 
         } 
        } 
    } 
    

    そして、少なくとも最後のではなく、毎回アプリを閉じたり、したいとき:文字列にNewtonsoft JSONプラグインでのviewmodelから収集をシリアル化し、設定クラス上店、それを、設定プラグインによって作成されます。

    はちょうどデシリアライズ設定クラスから、以前にシリアライズ文字列と繰り返し手続き開始からリストを復元するには!

    多くのように見えますが、維持管理しやすい、幸運です!

  • +0

    ありがとうございました。その間、私はラベルとスイッチボックスでカスタムViewCellを作成したカスタムセルのリストを作成しました。 – user1497086

    +0

    良いアプローチ! – Csharpest

    +0

    間違って私のAnsが上にありました。しかし、これが完了するために行ったことです...サンプルコードの詳細を参照してください。カスタムViewCellがあり、メインページにカスタムViewCellを複数回追加できます。 スイッチでトグルすると、トグルアクションではなくアイテム名がDBに保存されます。チェックしたアプリケーションをロードする次の時間名前が既にDB上に存在するかどうか、各エレメントのテーブルセクションを反復するアイテム名が存在する場合、スイッチのステータスはオンであり、それ以外のスイッチはオフです。 – user1497086

    0

    すてきなアプローチに感謝します。 上で説明したように私はカスタムViewCellを持っています。

    <ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
         x:Class="TODOListWithDB.Reusable.CustomSwitchCell"> 
    <Grid BackgroundColor="Gold" Padding="13,0"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="auto" /> 
        </Grid.RowDefinitions> 
        <Label Text="{Binding Label}" IsVisible="True" Grid.Row="0" Grid.Column="0" HorizontalOptions="StartAndExpand" /> 
        <Switch x:FieldModifier="public" x:Name="SwitchName" Toggled="OnFavoriteClicked" Grid.Row="0" Grid.Column="1" HorizontalOptions="EndAndExpand" /> 
    </Grid> 
    

    そして、私はメインページの複数の時間にカスタムViewCellを追加することができます。

    <TableSection Title="selectItems" x:Name="ParentTableSelection"><Switch:CustomSwithCell Label="item1"/><Switch:CustomSwithCell Label="Item2" />..... 
    

    私がスイッチで切り替えた場合、それはDB(ないトグルアクション)にアイテム名を保存する名前がすでにDB上か、表を反復することにより、存在する場合、私は私がチェックしたアプリケーションをロードする.Next時間それぞれの要素のセクション。アイテム名が存在する場合、スイッチのステータスはオンです。それ以外の場合は、スイッチはオフです。これが最善の方法であるかどうかはわかりません。素晴らしいアプローチに感謝します....

    +0

    本当にあなたがテーブルビューでのみこのviewcellを表示している場合は、各viewcellに対してlistview + viewmodelsを使用して、listviewをviewmodelsのリストにバインドしてください。しかし、その作品は、今のところokです。あなたのアプローチを改善する方法を学ぶときに、より重要なことをしてください – Csharpest

    関連する問題