2017-11-20 20 views
0

私が作業しているxamarin.forms androidプロジェクトでは、ListViewに表示するオブジェクトのリストがあります。オブジェクトはClassAに基づいています:条件付きでTextCell Detail属性をバインドする方法は?

public class ClassA 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public List<ClassB> Types { get; set; } 
} 

ClassBオブジェクトのリストに注意してください。 ClassBのは、次のようになります。

public class ClassB 
{ 
    public string Type { get; set; } 
    public int Count { get; set; } 
} 

私はこの部分的にこのように、XAMLを使用して作業:

<TextCell Text="{Binding Name}" Detail="{Binding Types[0].Count }" Tapped="Cell_OnTapped" /> 

問題の詳細属性の結合は値に応じて、行ごとに変更する必要があるということですClassA.ClassB.Typeプロパティの値。例えば。 Types[0].Count > 0場合、TextCellは、詳細属性の結合は次のようになります。

Types[0].Count 

Types[0].Count > 0Types[1].Count > 0場合、TextCellは、詳細属性の結合は次のようになります。

"type 1 count: " + Types[0].Count + "type 2: count: " Types[1].Count 

注3以上が決してしないことをClassA.Typesのアイテム。また、ClassB.Countの値はすべて事前に計算されます。

xamarin.formsをAndroid用に使用するにはどうすればよいでしょうか?

+2

あなたは、読み取り専用のプロパティを作成してそれにバインドし、プロパティ付きの条件付きロジックを配置することができます – Jason

+0

私はあなたがValueConverterを使用し、タイプを渡してからあなたの文字列を返すことができると思います –

+0

値コンバーターにBindingContextを渡して、ジョブを完了させます。 – Dilmah

答えて

0

ので(注:未テストコード!):同様にあなたは、値コンバータを使用することができます

public class MyConverter : IValueConverter, IMarkupExtension 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (Equals(value,null)) 
       return string.Empty; 

      var obj = (ClassA)value; 

      // Your logic here to work out the string to display 
      // NOTE: untested - may need to add null checks, etc. 
      if (obj.Types[0].Count > 0 && obj.Types[1].Count > 0) 
      { 
       return "type 1 count: " + Types[0].Count + "type 2: count: " Types[1].Count; 
      } 
      else if (obj.Types[0].Count > 0) 
      { 
       return Types[0].Count; 
      } 
      return string.Empty; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException("Only one way bindings are supported with this converter"); 
     } 

     public object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return this; 
     } 
    } 

そして、あなたのXAMLで、そのようにバインドします

<TextCell Text="{Binding Name}" Detail="{Binding ., Converter={converters:MyConverter} }" Tapped="Cell_OnTapped" /> 
0

あなたはその結果を得ることができます2つの異なるアプローチによって。

1:ValueConverter。

ClassContのTypesプロパティを直接バインドし、ValueConverter内に表示するロジックを実行します。これについての詳細here

2:

のViewModel

はあなた ClassAオブジェクトから構成されることになるのViewModelを実装します。

あなたのモデル

public class ClassA 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public List<ClassB> Types { get; set; } 
} 

public class ClassB 
{ 
    public string Type { get; set; } 
    public int Count { get; set; } 
} 

し、要件を取ると、あなたは1つの怒鳴るようにViewModelに実装できます。

public class ItemViewModel() 
{ 
    public string Name { get; set; } 

    public string Type { get; set; } 

    public ItemViewModel(ClassA classA) 
    { 
     Name = classA.Name; 

     if(classA.Types[0].Count > 0) 
     { 
      Type = $"{classA.Types[0].Count}"; 
     } 
     else if (classA.Types[0].Count > 0 && classA.Types[1].Count > 0) 
     { 
      Type = $"type 1 count: {Types[0].Count} type 2: count: {Types[1].Count}"; 
     } 
    } 
} 

そして、あなたはあなたの新しいリストにあなたのリストアイテムに変換することができますLINQのを使用してViewModelアイテム。

List<ClassA> Items = ...... 

var ItemVm = Items.Select(a => New ItemViewModel(a)).ToList(); 

あなたのビューにバインドするには、ItemVmを使用します。

・ホープ、このhelps.-

注:私はnullにするタイプの一覧について検証を一切行いませんでしたが、私はそれを行うことをお勧めします。

注2:ViewModelでINotifyPropertyChangedを実装する必要がある場合もあります。

関連する問題