2015-07-21 51 views
1

我正在使用MvvmCross创建一个Android应用程序,其中我必须根据值显示和隐藏一些控件。对于我创建了一个知名度转换器在PCL这样Xamarin中的可见性转换器Android

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

我们使用MvxVisibility插件就像在你的Xaml中。当您使用Visibility Plugin时,您不需要定义ValueConverter。并且:您需要在PCL项目和Android项目中添加插件。 – Joehl

+0

我已经在android项目和PCL中添加了该插件,但无法使用。你能否给我一些用控件绑定可见性的语法? –

回答

2

我在我的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; 
    } 

} 

和视图,XAML中:

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

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

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

编辑

你的ViewModels都应该从MvxViewModel继承和用于结合所需要的属性,实现属性更改呼叫RaisePropertyChanged(() => Property);。否则没有人知道变化。这是第一点。

但是,转换器应该在第一时间工作没有(据我所知)。所以我没有看到任何其他可以出错的东西..所以尝试创建一个简单的清洁项目只有这个问题和一个视图元素重现什么可以出错..

+0

是的,我同意,android视图元素不能通过MvxVisibility枚举更改可见性。这就是为什么我尝试使用MvxVisibility-Plugin,但它不起作用。有没有与Android版本的兼容性问题? –

+0

我不知道任何问题。我曾经有过同样的问题,因为我忘记了Android项目中的VisibilityPluginBootstrap。你添加了那个班吗? – Joehl

+0

是的,我已经添加了该类。我还检查了堆栈跟踪和插件已加载。我没有得到任何错误,但可见性绑定不起作用, –