2010-11-05 4 views
0

В related question я спросил о привязке к определенному элементу массива, индексированного другим свойством. Полученный ответ очень сработал для примера примера кода.WPF ListBox Binding ItemsSource

Где я столкнулся с трудностями, так это то, что я указываю ItemSource для ListBox, и я получаю DependencyProperty.UnsetValue в своем конвертере, когда я его просматриваю. Без сомнения, это проблема с моим пониманием Связывания.

Мой ListBox выглядит так:

<ListBox ItemsSource="{Binding Path=MyList}"> 
    <ListBox.Resources> 
     <local:FoodIndexConverter x:Key="indexConverter" /> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <TextBlock.Text> 
        <MultiBinding Converter="{StaticResource indexConverter}"> 
         <Binding Path="MyIndex" /> 
         <Binding Path="Fields" /> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

и код позади выглядит так:

public MainWindow() 
{ 
    InitializeComponent(); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "cake" } }); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "candy" } }); 
    MyList.Add(new SomeData() { Fields = new object[] {"liver", "onions", "pie" } }); 

    DataContext = this; 
} 

MyList является список.

MyIndex - это int.

Преобразователь код

public class FoodIndexConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (values == null || values.Length != 2) 
       return null; 

      int? idx = values[0] as int?; 
      object[] food = values[1] as object[]; 

      if (!idx.HasValue || food == null) 
       return null; 

      return food[idx.Value]; 
     } 

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

Когда я шаг через отладчик в конвертере коде MyIndex (значение [0]) является DependencyProperty.UnsetValue - массив объект, как я бы ожидать.

Я предполагаю, что это проблема, связанная с: тем, что она не знает, что такое MyIndex.

Если MyIndex был свойством класса SomeData, он работает так, как я ожидал бы, но это не так, это свойство класса MainWindow, как и MyList.

Как указать, что меня интересует свойство MyIndex, которое является частью моего DataContext, а не списка MyData?

ответ

1

Он ищет свойство MyIndex в ListBoxItem (в данном случае, класс SomeData) и это свойство не существует.

Задайте имя элемента в привязке к имени окна, чтобы найти его для поиска в другом месте.

<Binding ElementName=RootWindow, Path=DataContext.MyIndex /> 
+0

Да - отлично. Работал как чемпион. Хороший день - я чему-то научился. :) – itsmatt