2016-07-09 7 views
0

내가 문자열 배열 속성을 가진 MvxViewModel가 있다고 가정 :MvxViewModel에서 배열의 특정 위치에 속성을 바인딩하는 방법은 무엇입니까?

using System; 
using Cirrious.MvvmCross.ViewModels; 
namespace Foo { 
    public class FooViewModel : MvxViewModel { 
     private string[] mTexts; 
     public string[] Texts { 
      get { return mTexts; } 
      set { 
       mTexts = value; 
       RaisePropertyChanged(() => Texts); 
      } 
     } 
     public void Init() 
     { 
      Texts = new string[] { "foo", "bar" }; 
     } 
    } 
} 

나는 또한 하나의 문자열 속성과 아이폰 OS MvxViewController가 있다고 가정 :이 문자열 속성, Text을 결합 할 수있는 방법

using System; 
using Cirrious.MvvmCross.Touch.Views; 
using Cirrious.MvvmCross.Binding.BindingContext; 
namespace Foo { 
    public class FooView : MvxViewController { 
     public string Text { get; set; } 

     public override void ViewDidLoad() { 
      base.ViewDidLoad(); 
      var bindset = this.CreateBindingSet<FooView, FooViewModel>(); 
      bindset.Bind(Text).To("Texts[0]"); 
      bindset.Apply(); 
     } 
    } 
} 

, Texts 어레이의 한 위치 (예 : 0)로? 이 위의 ViewDidLoad() 방법하는 int 일이 있었는지에 의해 가능하다고 표시

내가 찾은 소스 (herehere)는, 그러나, 나는 경고를 얻을 : Unable to bind: source property source not found IndexedProperty:0 on String[].

무엇이 누락 되었습니까?

+0

왜 당신이 당신의 배열의 정적 색인에 결합 할 수 있습니까? 유스 케이스 란 무엇입니까? – Plac3Hold3r

답변

2

당신은 List 또는 ObservableCollection 대신 Array의를 사용할 수 있습니다

private List<string> mTexts; 
public List<string> Texts 
{ 
    get { return mTexts; } 
    set 
    { 
     mTexts = value; 
     RaisePropertyChanged(() => Texts); 
    } 
} 

내가 Mvx support for Array type properties에 장해야 아니에요. 나는 항상 ObservableCollection 또는 List을 사용하는 경향이 있습니다. Array에 바인딩하려고 할 때 나타나는 오류 메시지는 Array에서 색인 조회를 수행하는 데 어려움을 겪고있는 것으로 보입니다.

바인딩 할 수 없습니다 : 소스 속성 소스를 찾을 수 없습니다 IndexedProperty : 0 문자열 [] 내가 시도 일 듯

한 가지 방법은 뷰 모델에 Indexer을 구현하고 그 결합했다 .

뷰 모델

string[] mTexts; 
public string this[int index] => mTexts[index]; 

public void Init() 
{ 
    mTexts = new string[] { "foo", "bar" }; 
} 

아래 코멘트에 xleon에서 언급 한 바와 같이보기 바인딩

var bindset = this.CreateBindingSet<FooView, FooViewModel>(); 
bindset.Bind(Text).To(".[1]"); 
bindset.Apply(); 

는 기간은 선택 사항입니다. "[1]"을 사용하면 잘 작동합니다. 람다와

대안 :

var bindset = this.CreateBindingSet<FooView, FooViewModel>(); 
bindset.Bind(Text).To(vm => vm[1]); 
bindset.Apply(); 
+1

눈부신 솔루션. [1] 전에 실제로 점이 필요합니까? 비슷한 번역 방법을 사용합니다 : https://github.com/xleon/I18N-Portable#data-binding-and-mvvm-frameworks – xleon

+0

@xleon, 당신이 맞습니다. 선택 사항입니다, ""$ SourcePath $를 생략하면 또는 단일 마침표 "."가 사용 된 경우 사용 된 소스는 ViewModel 전체입니다. "] (https://mvvmcross.com/docs/data-binding#section-swiss). 지금 생각해 보면, lambda는 아마 더 나을 것이고, 그것은'ViewModel','bindset.Bind (Text)[email protected], 번역 라이브러리를 매우 좋아합니다. 번역을 수행하는 데 아주 깨끗한 방법처럼 보입니다. 시도해 볼 필요가 있습니다. – Plac3Hold3r

+1

. 절대로 시도하지 않았습니까, 작동합니까? – Plac3Hold3r

관련 문제