2016-12-21 6 views
1

私はAndroid.Support.V7.Widget.SwitchCompatを私のviewmodel(私が使っているフレームワークです)にバインドするのに苦労しています 完全にうまく動作する別のオブジェクトのクリックバインドとまったく同じでした。MvxBind CheckedChange SwitchCompat

ビューを表示するとき、私は取得していますエラーは、次のとおりです。私が持っているスイッチの量のため

12-21 10:32:06.459 I/MvxBind (22969): 42,82 Failed to create target binding for binding CheckedChange for OnCheckedChanged 
[0:] MvxBind:Warning: 42,82 Failed to create target binding for binding CheckedChange for OnCheckedChanged 

複数回。

彼らはそれがために反射魔法のようなものは含まないリンカーを有する何かをしなければならないかもしれないと言いました。

彼らはあなたがあなたのswitchcompatへの参照を保持するために、ファイル「LinkerPleaseInclude」を作成する必要が言ったこの方法です。私は次のようにしましたが、それでもエラーは解決しません。

LinkerPleaseInclude

class LinkerPleaseInclude 
{ 
    public void Include(TextView text) 
    { 
     text.AfterTextChanged += (sender, args) => text.Text = "" + text.Text; 
     text.Hint = "" + text.Hint; 
    } 

    public void Include(CompoundButton cb) 
    { 
     cb.CheckedChange += (sender, args) => cb.Checked = !cb.Checked; 
     cb.Hint = "" + cb.Hint; 
    } 
    public void Include(SwitchCompat cb) 
    { 
     cb.CheckedChange += (sender, args) => cb.Checked = !cb.Checked; 
     cb.Hint = "" + cb.Hint; 
    } 
    public void Include(ICommand command) 
    { 
     command.CanExecuteChanged += (s, e) => { if (command.CanExecute(null)) command.Execute(null); }; 
    } 
    public void Include(CheckBox checkBox) 
    { 
     checkBox.CheckedChange += (sender, args) => checkBox.Checked = !checkBox.Checked; 
    } 
} 

マイViewLayout:このレイアウトは、別のレイアウトの子である

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/md_list_single_line_item_height" 
    android:gravity="center_vertical" 
    android:paddingLeft="@dimen/md_list_item_horizontal_edges_padding" 
    android:paddingRight="@dimen/md_list_item_horizontal_edges_padding"> 
    <android.support.v7.widget.SwitchCompat 
    android:id="@+id/mySwitch" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    local:MvxBind="Checked IsActive; Click OnSwitchClick; CheckedChange OnCheckedChanged" /> 
    <TextView 
    android:id="@+id/Name" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:textColor="@color/md_text_dark_primary_87" 
    android:textSize="@dimen/md_list_item_primary_text" 
    local:MvxBind="Text Name"/> 
    <TextView 
    android:id="@+id/Kind" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:textColor="@color/md_text_dark_secondary_54" 
    android:textSize="@dimen/md_list_item_secondary_text" 
    android:layout_below="@+id/Name" 
    local:MvxBind="Text Kind"/> 
</RelativeLayout> 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/md_list_two_line_item_height" 
    android:paddingTop="?android:attr/actionBarSize" 
    android:fitsSystemWindows="true"> 
    <MvxClickableLinearLayout 
     android:id="@+id/animalSelectionsList" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:divider="@drawable/divider_horizontal" 
     android:showDividers="middle" 
     local:MvxBind="ItemsSource SelectionsList" 
     local:MvxItemTemplate="@layout/listitem_animal_selections" /> 
</LinearLayout> 
+0

Iamはわからないが、android.support.v7.widget.SwitchCompatは、チェックボックスとは何の関係もないかもしれないので?そしてそれはちょうどCheckedChangeをサポートしませんか? https://developer.android.com/reference/android/support/v7/widget/SwitchCompat.html – Cyriac

+0

SwitchCompatはCompoundButtonからの派生型です。チェックボックスと同様です。 https://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html CompoundButtonには、「CheckedChange」イベントがあります – Baklap4

+0

あなたのモデルを見てみることができます。リンカの場合は、リンカがsdkとユーザアセンブリのリンクを行うかどうかを決めるために、プロジェクト設定のアンドロイドオプションを異なる方法で設定してみてください(デフォルトの設定は何ですか)。それがリンカの欠陥であるかどうかをテストするだけです。 – Cyriac

答えて

2

CheckedChangeは、したがって、それは公共の財産ではなく、イベントです。これを処理してCommandを公開する独自のTarget Bindingを作成しない限り、MvvmCrossのイベントを直接バインドすることはできません。そして、あなたはあなたのコマンドにMyCheckedChangeをバインドすることができ

registry.RegisterCustomBindingFactory<View>("MyCheckedChange", 
    view => new MvxCompoundButtonCheckedChangeBinding(view)); 

public class MvxCompoundButtonCheckedChangeBinding : MvxAndroidTargetBinding 
{ 
    private ICommand _command; 
    private IDisposable _checkedChangeSubscription; 
    private IDisposable _canExecuteSubscription; 
    private readonly EventHandler<EventArgs> _canExecuteEventHandler; 

    protected CompoundButton View => (CompoundButton)Target; 

    public MvxCompoundButtonCheckedChangeBinding(CompoundButton view) 
     : base(view) 
    { 
     _canExecuteEventHandler = OnCanExecuteChanged; 
     _checkedChangeSubscription = view.WeakSubscribe<CompoundButton, CompoundButton.CheckedChangeEventArgs>(nameof(view.CheckedChange), ViewOnCheckedChangeClick); 
    } 

    private void ViewOnCheckedChangeClick(object sender, CompoundButton.CheckedChangeEventArgs args) 
    { 
     if (_command == null) 
      return; 

     if (!_command.CanExecute(null)) 
      return; 

     _command.Execute(view.Checked); 
    } 

    protected override void SetValueImpl(object target, object value) 
    { 
     _canExecuteSubscription?.Dispose(); 
     _canExecuteSubscription = null; 

     _command = value as ICommand; 
     if (_command != null) 
     { 
      _canExecuteSubscription = _command.WeakSubscribe(_canExecuteEventHandler); 
     } 
     RefreshEnabledState(); 
    } 

    private void RefreshEnabledState() 
    { 
     var view = View; 
     if (view == null) 
      return; 

     var shouldBeEnabled = false; 
     if (_command != null) 
     { 
      shouldBeEnabled = _command.CanExecute(null); 
     } 
     view.Enabled = shouldBeEnabled; 
    } 

    private void OnCanExecuteChanged(object sender, EventArgs e) 
    { 
     RefreshEnabledState(); 
    } 

    public override MvxBindingMode DefaultMode => MvxBindingMode.OneWay; 

    public override Type TargetType => typeof(ICommand); 

    protected override void Dispose(bool isDisposing) 
    { 
     if (isDisposing) 
     { 
      _checkedChangeSubscription?.Dispose(); 
      _checkedChangeSubscription = null; 

      _canExecuteSubscription?.Dispose(); 
      _canExecuteSubscription = null; 
     } 
     base.Dispose(isDisposing); 
    } 
} 

が次にあなたが FillTargetFactoriesオーバーライドであなたのSetup.csに登録する必要があります。

これはのようになります。

+0

? – Cyriac

+0

これは疑わしいものとして機能します!しかし、@Cyriacは、他のクラスは何のために述べたように? – Baklap4

+1

これは、すでに使用している「チェック済み」ソース用のものです。 – Cheesebaron

関連する問題