2013-07-29 1 views
2

Связывание булево (HasLiked) на прессованные из ViewModel приводит к ошибке:Состояние Android: нажатие, активация, выбор и т. Д. Привязки. Должен ли я писать пользовательские привязки?

Failed to create target binding for from HasLiked to Pressed 

Означает ли это, что андроид View.Pressed (и другие страны) привязок по MvxBind не поддерживаются по умолчанию? Нужно ли писать пользовательские привязки?

Edit- связывания:

<RelativeLayout 
     style="@style/ButtonExtraSocial" 
     android:background="@drawable/SelectorButtonExtra" 
     app:MvxBind="Click LikeCommand; Pressed HasLiked"> 
.... 
</RelativeLayout> 

HasLiked существует булево в ViewModel (когда я связать его с TextView текст, я получаю значение).

+0

Хорошо работает здесь, можете ли вы показать свое обязательное описание? – Cheesebaron

+0

Я думал, что он тоже должен работать нормально ... Я обновил свой вопрос. –

+0

Какой у вас след? Основной ответ: если это «EventHandler», привязка будет работать, но если это «EventHandler », тогда вам нужно написать пользовательскую привязку (это не сложно) – Stuart

ответ

4

Я не могу воспроизвести вашу проблему здесь. Я создал очень простой образец, который делает то, о чем вы просите.

FirstViewModel.cs

public class FirstViewModel 
    : MvxViewModel 
{ 
    public FirstViewModel() 
    { 
     IsPressed = true; 
    } 

    private string _hello = "Hello MvvmCross"; 
    public string Hello 
    { 
     get { return _hello; } 
     set { _hello = value; RaisePropertyChanged(() => Hello); } 
    } 

    public bool _isPressed; 
    public bool IsPressed 
    { 
     get { return _isPressed; } 
     set { _isPressed = value; RaisePropertyChanged(() => IsPressed); } 
    } 
} 

FirstView.cs

[Activity(Label = "View for FirstViewModel")] 
public class FirstView : MvxActivity 
{ 
    public new FirstViewModel ViewModel 
    { 
     get { return (FirstViewModel)base.ViewModel; } 
     set { base.ViewModel = value; } 
    } 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.FirstView); 

     var button = FindViewById<Button>(Resource.Id.button); 
     button.Click += (sender, args) => ViewModel.IsPressed = !ViewModel.IsPressed; 
    } 
} 

FirstView.axml

<?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="fill_parent" 
    android:layout_height="fill_parent"> 
    <EditText 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="40dp" 
    local:MvxBind="Text Hello" 
    /> 
    <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="40dp" 
    local:MvxBind="Text Hello" 
    /> 
    <Button 
    android:id="@+id/button" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    local:MvxBind="Text Hello; Pressed IsPressed"/> 
    <RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:background="@drawable/bg" 
    local:MvxBind="Pressed IsPressed"/> 
</LinearLayout> 

bg.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/bg_pressed" 
     android:state_pressed="true"/> 
    <item android:drawable="@drawable/bg_normal"/> 
</selector> 

bg_normal.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#FF0000" /> 
</shape> 

bg_pressed.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#FF00FF" /> 
</shape> 

Это производит эти две различные визуальные состояния:

First State Second State

Как вы видите, он начинается с IsPressed и правдивым, когда я нажимаю кнопку становится ложным. Я подтвердил, что он работает и наоборот.

1

Спасибо за ваши ответы, но я выяснил, в чем была причина этой проблемы: настройки упаковки в студии Xamarin: «Использовать совместное моно исполняемое время» должно быть включено (я думаю, что по умолчанию он проверяется, но я его не контролировал).

Вы можете получить доступ к настройкам упаковки, щелкнув правой кнопкой мыши на проекте (а не на решении!)> Свойства> Android Build> Использовать общую среду Mono.