Xamarin Android中的可见性转换器

时间:2015-07-21 09:35:30

标签: android xamarin xamarin.android mvvmcross

我正在使用MvvmCross创建一个Android应用程序,我必须根据值显示和隐藏listview中的一些控件。为此,我在PCL中创建了一个可见性转换器

public class VisibilityValueConverter : MvxValueConverter<bool, MvxVisibility>
    {
        protected override MvxVisibility Convert(bool value, Type targetType, object parameter, CultureInfo culture)
        {

            return (value == true) ? MvxVisibility.Visible : MvxVisibility.Collapsed;
        }

    }

我正在布局页面中使用此值转换器

      <?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">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        local:MvxBind="Text QuestionText"
        android:layout_marginTop="15dp" />
    <RadioGroup
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/radioGroup1"
        android:layout_marginTop="5dp">
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton1"
            local:MvxBind="Text OptionA" />
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            local:MvxBind="Text OptionB"
            android:id="@+id/radioButton2" />
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            local:MvxBind="Text OptionC"
            android:id="@+id/radioButton3" />
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            local:MvxBind="Text OptionD"
            android:id="@+id/radioButton4" />
    </RadioGroup>
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="159.0dp"
        android:textSize="20dp"       
        android:layout_marginTop="2dp"       
        local:MvxBind="Visibility TexboxVisible,Converter=Visibility" />
</LinearLayout>

但它不起作用。它没有达到PCL值转换器中的断点。

我也试过使用MvxVisibility插件,但它也无法正常工作。 我想我做错了什么。有人可以帮忙,让我知道如何在android中的listview中使用visibilty转换器。

视图模型

   public class Question
    {  
        public string Type { get; set; }        
        public bool RadioVisible { get; set; }
        public bool TexboxVisible { get; set; }  

    }

private List<Question> _questionList;
        public List<Question> QuestionList
        {
            get { return _questionList; }
            set
            {
                _questionList = value;
                RaisePropertyChanged(() => QuestionList);


            }
        }
 private async void ShowQuestionsList(int assignmentId)
        {
QuestionList = await _service.GetQuestionListByAssignmentAsync(assignmentId);
if (QuestionList != null)
                    {
                        foreach (Question q in QuestionList)
                        {


 if (q.Type != null)
                            {
                                if (q.Type == "S")
                                {
                                    q.RadioVisible = false;
                                    q.TexboxVisible = true;
                                }

                                else if (q.Type == "O")
                                {
                                    q.RadioVisible = true;
                                    q.TexboxVisible = false;
                                }
                            }
}
}
}

1 个答案:

答案 0 :(得分:3)

我的Testconverter中的断点被解雇了。我的代码:

public class TestMethodValueConverter : MvxValueConverter<bool, MvxVisibility>
{
    protected override MvxVisibility Convert(bool value, Type targetType, object parameter, CultureInfo culture)
    {
        return value ? MvxVisibility.Visible : MvxVisibility.Collapsed;
    }

}

View-Xaml:

local:MvxBind="Visibility MyBoolProperty, Converter=TestMethod"

但还有另一个问题。 android视图元素无法使用MvxVisibility枚举更改可见性。他们需要Android.Vioews.ViewStates值。

因此您需要在Android项目中添加转换器。这就是为什么我们使用MvxVisibility-Plugin。

修改

您的viewmodel应该都从MvxViewModel继承,并且用于绑定的属性需要实现属性更改的调用RaisePropertyChanged(() => Property);。否则没有人知道变化。这是第一点。

但转换器应该在没有它的情况下第一次工作(据我所知)。所以我没有看到任何其他可能出错的东西..所以尝试创建一个只有这个问题的简单干净项目和一个单一的View-Element来重现可能出错的地方..