2013-01-20 5 views
0

이것은 아마도 매우 어리석은 질문이지만, 나는 그 사실을 이해할 수 없다.인덱서 바인딩

class ViewModel 
{ 
    public Row CurrentRow{get;} 
    public Accessor CurrentAccessor {get;} 
} 

가 어떻게 XAML에서 바인딩 CurrentRow[CurrentAccessor]을 정의 할 수 있습니다 : 나는이 같은 뷰 - 모델이있는 경우

class Accessor 
{ 
} 


class Row : INotifyCollectionChanged 
{ 
    public object this[Accessor index] {get;} 
} 

그리고 : 나는이 두 클래스로 표시되는 데이터 구조를 가지고 있다고 가정? {Binding Path=CurrentRow[{Binding Path=CurrentAccessor}]}을 사용해 보았지만이 방법은 효과가없는 것 같습니다.

업데이트 : 나는 행 클래스는 너무 값이 저장된 경우
public object WrappedProperty { get{return CurrentRow[CurrentAccessor];}} 그 이후 작동하지 않을 것이 더 업데이트가 없을 것 같은 간단한 속성 래퍼를 사용하여, INotifyCollectionChanged 인터페이스를 구현하는 모음입니다 지적한다 CurrentRow [CurrentAccessor]가 변경됩니다.

답변

2

당신은 적절한 변환기를 A MultiBinding에 바인딩을 변경할 수 있습니다

<MultiBinding Converter="{StaticResource RowAccessorConverter}"> 
    <Binding Path="CurrentRow"/> 
    <Binding Path="CurrentAccessor"/> 
</MultiBinding> 

컨버터는 다음과 같습니다

public class RowAccessorConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var row = values[0] as Row; 
     var accessor = values[1] as Accessor; 
     return row[accessor]; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
+1

+1하지만 액세서로 'var accessor = values ​​[1]'이 아닐 것입니다. (인덱스 1은 인덱스 0이 아닙니다.) – Blachshma

+1

@Blachshma 정확히! 이제 내가 실제로 테스트하지 않았다는 것을 알 수있다 :-) – Clemens

2

ViewModel에서 추가 속성을 만들 수 있습니다.

class ViewModel 
{ 
    public object Obj { get { return CurrentRow[CurrentAccessor]; } } 
    public Row CurrentRow{ get; } 
    public Accessor CurrentAccessor { get; } 
} 

그리고 지금 결합은 간단하다 :

{Binding Obj} 
+0

좋은 답변입니다. wer :) 그리고 그것은 내가 생각해 낸 첫 번째 것이었지만 내 경우에는 적합하지 않습니다. 내 원래의 질문을 업데이트하여 내 상황이 더 잘 일치하도록했습니다. Plz 그것을 확인하십시오. –