在Silverlight 4中使用表单的模式? (如何获取对XAML元素的引用)

时间:2010-12-12 20:58:47

标签: silverlight xaml silverlight-4.0

我有一张表格:

                    <StackPanel Orientation="Horizontal" Visibility="{Binding Editable, Converter={StaticResource visibilityConverter}}"
                                ToolTipService.ToolTip="Add new topic to this group">
                        <sdk:AutoCompleteBox Width="160" ItemsSource="{Binding ElementName=LayoutRoot, Path=DataContext.TopicNames}" />
                        <Button Click="addTopicButton_Click">
                            <Image Source="Images/appbar.add.rest.png" />
                        </Button>
                    </StackPanel>

此表单显示在DataTemplate的{​​{1}}中。我不确定在单击按钮时从ItemsControl获取数据的最佳方法是什么。我不能给出元素AutoCompleteBox属性,因为它们在模板中(对吗?)。

我该如何解决这个问题? x:Name事件会给我Click,但我需要对文本框的引用。使用Button的父级,然后查看子项的文本框?如果我将其考虑在自己的Button中,我可以设置UserControl值,但我宁愿不这样做。

还有其他想法吗?

更新:以下是此类问题的另一个示例:

x:Name

点击该按钮后,我想访问 <ListBox x:Name="topicList" ItemsSource="{Binding Id, Converter={StaticResource topicGroupIDConverter}}" SelectionChanged="ListBox_SelectionChanged" HorizontalAlignment="Stretch"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" Width="150" VerticalAlignment="Center" ToolTipService.ToolTip="{Binding Description}" ToolTipService.Placement="Right" /> <Button ToolTipService.ToolTip="Remove this topic from this group" Visibility="{Binding ElementName=topicList, Path=DataContext.Editable, Converter={StaticResource visibilityConverter}}" Click="removeTopicButton_Click" HorizontalAlignment="Right" Margin="10,0"> <Image Source="Images/appbar.cancel.rest.png" /> </Button> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 。但是,topicList.DataContext本身是topicList中的DataTemplate,因此我无法使用代码隐藏中的名称来访问它。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以向演示者添加一个属性,比如说SelectedItemInAutoCompleteBox,然后可以使用SelectedItem将其绑定到AutoCompleteBox Mode=TwoWay属性,如下所示,

<sdk:AutoCompleteBox SelectedItem="{Binding Path=DataContext.SelectedItemInAutoCompleteBox, Mode=TwoWay}"  ... />

您也可以使用Text AutoCompleteBox属性尝试相同的方法。看看它是否解决了你的问题。: - )

答案 1 :(得分:0)

您有多种选择:

  1. 如果您使用的是Silverlight 5,请使用AncestorBinding

  2. 否则,请使用Silverlight 4 AncestorBinding hack(看起来不太漂亮)

  3. 或者您可以尝试DataContextProxy,它将DataContext存储在资源中以便可以访问。注意:您应该将DataContextProxy设置为topicList ListBox的资源,而不是Dan Wahlin示例中的UserControl。