我正在使用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;
}
}
}
}
}
答案 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来重现可能出错的地方..