Шаблон для работы с формой в Silverlight 4?(Как получить ссылки на элементы XAML) - PullRequest
0 голосов
/ 12 декабря 2010

У меня есть форма:

                    <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 для ItemsControl. Я не уверен, что лучший способ получить данные из AutoCompleteBox при нажатии кнопки. Я не могу дать атрибуты x:Name элементов, потому что они в шаблоне (верно?).

Как я могу обойти это? Событие Click даст мне 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 в ItemsControl, поэтому я не могу получить к нему доступ, используя его имя из кода кода. Как еще я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

У вас есть несколько вариантов:

  1. Если вы используете Silverlight 5, используйте AncestorBinding

  2. В противном случае используйте Silverlight 4 AncestorBinding hack (выглядит не очень красиво)

  3. Или вы можете попробовать DataContextProxy , который хранит DataContext в ресурсе, так чтодоступны.Примечание: вы должны установить DataContextProxy в качестве ресурса ListBox topicList, а не UserControl, как в примере Дэна Уолина.

0 голосов
/ 13 декабря 2010

Вы можете добавить свойство, скажем SelectedItemInAutoCompleteBox, к своему докладчику, а затем привязать его к свойству SelectedItem AutoCompleteBox, используя Mode=TwoWay, например,

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

Вы также можете попробовать тот же подход с Text свойством AutoCompleteBox.Посмотрите, решит ли это вашу проблему. :-)

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