2009-11-24 4 views
3

Я получил Indexer свойство в классе под названием X, пусть X[Y] дает мне еще один объект типа Z:XAML Индексатор DataBinding

<ContentControl Content="{Binding X[Y]}" ...??? 

Как я могу сделать DataBinding произойти внутри индексатор? Он работает, если я делаю {Binding [0]}. Но {Binding X[Y]} просто принимает параметр индексатора в виде строки, которая равна Y.

Update: Converter вариант, но у меня есть много классов ViewModel с индексатор и не имеет такой же сбор, поэтому я не могу позволить себе сделать раздельные преобразователи для всех тех. Поэтому я просто хотел знать, что это поддерживается в WPF, если да, как объявить Content=X[Y], где X и Y - DataContext свойства?

ответ

2

Единственный способ, который я нашел для этого, - через MultiBinding и IMultiValueConverter.

<TextBlock DataContext="{Binding Source={x:Static vm:MainViewModel.Employees}"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource conv:SelectEmployee}"> 
      <Binding /> 
      <Binding Path="SelectedEmployee" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

И ваш конвертер:

public class SelectEmployeeConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     Debug.Assert(values.Length >= 2); 

     // change this type assumption 
     var array = values[0] as Array; 
     var list = values[0] as IList; 
     var enumerable = values[0] as IEnumerable; 
     var index = Convert.ToInt32(values[1]); 

     // and check bounds 
     if (array != null && index >= 0 && index < array.GetLength(0)) 
      return array.GetValue(index); 
     else if (list != null && index >= 0 && index < list.Count) 
      return list[index]; 
     else if (enumerable != null && index >= 0) 
     { 
      int ii = 0; 
      foreach (var item in enumerable) 
      { 
       if (ii++ == index) return item; 
      } 
     } 

     return Binding.DoNothing; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Да спасибо и это очевидное решение, если есть только один класс. Но у меня есть много классов ViewModel, похожих на это. Поэтому я не могу позволить себе иметь отдельные конвертеры. Вместо этого я меняю логику Indexer на что-то еще. –

+0

Я пошел вперед и обновил это, чтобы работать с множеством типов коллекций. – user7116

Смежные вопросы