Найти элемент управления в ListViewItem - PullRequest
0 голосов
/ 18 июля 2011

У меня есть ListView, отображающий список элементов, содержащих в основном два свойства.

Каждое из этих свойств в идеале должно выбираться из двух комбинированных списков.

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

Итак, вот идея кода, который я использовал:

<ListView>
   <ListView.ItemTemplate>
       <DataTemplate>
          <StackPanel>
              <ComboBox Name="combo1"
                        ItemsSource="{DynamicResource combo1Source}"
                        SelectedItem="{Binding FirstProperty}"
                        SelectionChanged="combo_SelectionChanged">
              <ComboBox Name="combo2"
                        ItemsSource="{DynamicResource combo2Source}"
                        SelectedItem="{Binding SecondProperty}">
          </StackPanel>
       <DataTemplate>
   <ListView.ItemTemplate>
</ListView>

Дело в том, что я не знаю, как получить ссылку на combo2 из combo_SelectionChanged (в C #).

Не могли бы вы показать мне, как действовать?

Ответы [ 3 ]

1 голос
/ 18 июля 2011

У вас не должно быть ссылки на combo2, но вы должны обновить combo2Source Collection, который связан как ItemsSource для combo2 ...

Так что в combo_SelectionChanged вы просто загружаете возможные значения для фактического выбораcombo1 в коллекцию combo2Source.

РЕДАКТИРОВАТЬ: Чтобы предотвратить это для всех элементов одинаково:

Добавьте ValueConverter, который выбирает для selectedItem соответствующую коллекцию возможных значений:

<ComboBox ItemsSource="{Binding ElementName=Combo1, Path=SelectedItem, Converter={StaticResource SubSelectionConverter}}" />

Пример ValueConverter:

private Dictionary<Object, List<Object>> _PossibleValues;
public object Convert(Object data, ....)
{
   if(PossibleValues.ContainsKey(data))
   {
      //return the possible values for the actual selected parent item
      return(PossibleValues(data));
   }
   return null;
}
1 голос
/ 18 июля 2011

Самое простое, что вы можете сделать, это добавить Tag к combo1:

 <ComboBox Name="combo1" Tag="{x:Reference combo2}" ... />

Что вы можете затем получить из sender в обработчике событий, например,

var combo2 = (sender as FrameworkElement).Tag as ComboBox;

В качестве альтернативы вы можете получить StackPanel из свойства Parent и просто взять (ComboBox)Children[1]. Я бы не стал этого делать, хотя это ломается, если меняется структура вашего шаблона.

0 голосов
/ 18 июля 2011

Здесь можно посмотреть мой вопрос, различные ответы и решение, которое я нашел для моего конкретного проекта:

Найти элемент в шаблоне данных

Надеюсь, это поможет.

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...