2016-12-21 9 views
1

У меня возникли проблемы с привязкой моего Android.Support.V7.Widget.SwitchCompat к моей модели просмотра (Mvvmcross - это каркас, который я использую) Я сделал то же самое, что и с привязкой клика на другом объекте, который отлично работает.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 

Несколько раз на сумму коммутаторов я есть.

Они сказали, что, возможно, придется что-то сделать с компоновщиком, не включая материал из-за магии отражения.

Таким образом, они сказали, что вам нужно создать файл «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

Я не уверен, но может быть, потому что 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 и пользователя или нет (не уверен, что такое настройка по умолчанию atm). Просто проверить, является ли это ошибкой линкеров. – Cyriac

ответ

2

CheckedChange это событие, следовательно, она не является публичной собственностью , Вы не можете напрямую связывать события в MvvmCross, если только вы не создаете собственное целевое привязку, которое обрабатывает это и предоставляет команду.

Это может выглядеть примерно так:

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); 
    } 
} 

Затем вам нужно зарегистрировать его в вашем Setup.cs в FillTargetFactories переопределение:

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

Затем вы можете связать MyCheckedChange к вашей команде.

+0

Для чего же этот класс https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross/Binding/Droid/Target/MvxCompoundButtonCheckedTargetBinding.cs? – Cyriac

+0

Это работает как подозреваемый! Но как сказал @Cyriac для другого класса? – Baklap4

+1

Это для источника «Проверено», который вы уже используете. – Cheesebaron

 Смежные вопросы

  • Нет связанных вопросов^_^