从ComboBox的子控件内部访问父级控件

时间:2010-05-26 15:46:06

标签: silverlight combobox

我有类似的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对象中)。想法是用户可以从标准中添加/删除标准项,每个标准由列表框项表示。在列表框项目中,我有一个组合框和三个文本框。我要做的是根据ComboBox中选择的项目更改TextBox控件的可见性。例如,如果用户选择“模式匹配”,那么我想只显示第一个文本框并隐藏后两个;相反,如果用户选择“长度”或任何“数量...”项,那么我想隐藏第一个TextBox并显示后两个。

实现这一目标的最佳方法是什么?我希望在组合框的SelectionChanged事件处理程序中做一些简单的事情,但文本框控件可能不在组合框的SelectionChanged事件范围内。我是否必须以编程方式遍历控件层次结构并找到控件?

1 个答案:

答案 0 :(得分:0)

您可以将可见性绑定到组合框所选项目,然后使用值转换器返回可见性。 here is a demo of how to do Binding Converters可能对您有帮助。

<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
   }
}