【问题标题】:Visibility Converters in Xamarin AndroidXamarin Android 中的可见性转换器
【发布时间】:2015-07-21 09:35:29
【问题描述】:

我正在使用 MvvmCross 创建一个 android 应用程序,其中我必须根据值在列表视图中显示和隐藏一些控件。为此,我在 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 中使用可见性转换器。

视图模型

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

【问题讨论】:

  • 我们使用 MvxVisibility 插件,就像在您的 Xaml 中一样。使用 Visibility Plugin 时不需要定义 ValueConverter。并且:您需要在 PCL 项目和 Android 项目中添加插件。
  • 我已在 android 项目和 PCL 中添加了该插件,但它无法正常工作。你能告诉我用控件绑定可见性的语法吗?

标签: android xamarin xamarin.android mvvmcross


【解决方案1】:

我的 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 的原因。

编辑

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

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

【讨论】:

  • 是的,我同意,android 视图元素不能通过 MvxVisibility 枚举更改可见性。这就是为什么我尝试使用 MvxVisibility-Plugin,但它不起作用。安卓版本有兼容性问题吗?
  • 我不知道有什么问题。我曾经遇到过同样的问题,因为我在我的 Android 项目中忘记了 VisibilityPluginBootstrap。你添加了那个类吗?
  • 是的,我已经添加了那个类。我还检查了堆栈跟踪并加载了插件。我没有收到任何错误,但可见性绑定不起作用,
  • 嗯..好的。所以绑定本身可能是一个问题。请发布您的 ViewModel 或您的属性“TexboxVisible”的实现
  • TexboxVisible 是属性名称。我也是一样的。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2013-08-18
  • 2014-03-23
相关资源
最近更新 更多