Доступ к элементам управления родительского уровня из дочерних элементов управления ComboBox - PullRequest
0 голосов
/ 26 мая 2010

У меня есть XAML, похожий на этот:

<ListBox ItemsSource="{Binding SearchCriteria, Source={StaticResource model}}" SelectionChanged="cboSearchCriterionType_SelectionChanged">
<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Name="spCriterion" Orientation="Horizontal" Height="20">
            <ComboBox Name="cboSearchCriterionType" Width="120" SelectionChanged="cboSearchCriterionType_SelectionChanged">
                <ComboBox.Items>
                    <ComboBoxItem IsSelected="True" Content="Anagram Match" />
                    <ComboBoxItem Content="Pattern Match" />
                    <ComboBoxItem Content="Subanagram Match" />
                    <ComboBoxItem Content="Length" />
                    <ComboBoxItem Content="Number of Vowels" />
                    <ComboBoxItem Content="Number of Anagrams" />
                    <ComboBoxItem Content="Number of Unique Letters" />
                </ComboBox.Items>
            </ComboBox>
            <TextBox x:Name="SearchSpec" Text="{Binding SearchSpec}" />
            <TextBox x:Name="MinValue" Text="{Binding MinValue}" Visibility="Collapsed" />
            <TextBox x:Name="MaxValue" Text="{Binding MaxValue}" Visibility="Collapsed" />
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

Как вы можете видеть из разметки, у меня есть список, связанный с коллекцией объектов SearchCriterion (собирательно содержащихся в объекте SearchCriteria). Идея состоит в том, что пользователь может добавлять / удалять элементы критериев из критериев, каждый критерий представлен элементом списка. Внутри элемента списка у меня есть комбинированный список и три текстовых поля. Я пытаюсь изменить видимость элементов управления TextBox в зависимости от элемента, выбранного в ComboBox. Например, если пользователь выбирает «Сопоставление с образцом», я хочу показать только первое текстовое поле и скрыть два последних; и наоборот, если пользователь выбирает «Длина» или любой из элементов «Количество ...», я хочу скрыть первый текстовый блок и показать два последних.

Каков наилучший способ добиться этого? Я надеялся сделать что-то простое в обработчике событий SelectionChanged для комбинированного списка, но элементы управления текстовым полем, по-видимому, выходят за пределы области действия события SelectionChanged. Нужно ли программно проходить иерархию элементов управления и находить элементы управления?

1 Ответ

0 голосов
/ 26 мая 2010

Вы можете привязать видимость к выбранному элементу комбинированного списка, а затем использовать преобразователь значений, чтобы вернуть видимость. Вот демонстрация того, как сделать Обязательные Преобразователи , которые могут вам помочь.

<TextBox x:Name="MinValue" Text="{Binding MinValue}" Visibility="{Binding SelectedItem, ElementName=cboSearchCriterionType, Converter={StaticResource MyConverter}}" />

// declare the converter in xaml....
<SomeElement.Resource>
<local:MyConverter x:Key="MyConverter"/>
</SomeElement.Resource>

public class MyConverter : IValueConverter
{
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      // value will be the combobox.selecteditem
      // do stuff and return the visibility
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...