SL запускает команду из шаблона данных ListItem в ViewModel для MainPage.xaml - PullRequest
2 голосов
/ 24 мая 2011

Я могу сделать это более сложным, чем необходимо ... но здесь.

У меня есть файл MainPage.xaml, там есть ссылки на два других элемента UserControl, ResultsView и DetailsView.

Внутри Results, у меня ListBox, связанный с ObservableCollection пользовательских элементов, у меня есть DataTemplate, который отображает каждый элемент. У элемента есть CaseID, и когда я нажимаю на него, он отображается как HyperlinkButton, мне нужна команда, которую я установил в MainPageViewModel для запуска, которая обрабатывает изменение видимости, чтобы скрыть ResultsView и показать DetailsView.

Как связать команду с гиперссылкой с командой, расположенной в моей MainPageViewModel?

Заранее спасибо!

изменить для уточнения:

MainPage.xaml

<resultsView:ResultsView/>
<detailsView:DetailsView/>

Каждое из двух представлений (ResultsView & DetailsView) имеет свою собственную ViewModel. Итак, я иду от моего DataTemplate, который находится в ListBox внутри моего ResultsView, мне нужно перейти к MainPageViewModel, дополнительный шаг, чем упомянутый твой ответ. Попробовал ваш метод, назвав мой MainPage.xaml в Name = "mainPage" и используя его в качестве ElementName в моей HyperlinkButton, но не повезло. Я проведу некоторое исследование по опции RelativeSource и посмотрю, смогу ли я сделать эту работу.

Спасибо за вашу помощь.

edit 2: Забыл добавить, что DataTemplate находится в ResourceDictionary, а не в ResultsView.

1 Ответ

1 голос
/ 24 мая 2011

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

Предположим, что ваши DataTemplate для пользовательских элементов находятся в XAML пользовательского элемента управления ResultsView. Это хорошее место, но вы могли бы поместить его в словарь ресурсов.

Как вы говорите, ListBox привязан к коллекции пользовательских предметов. Далее предположим, что коллекция пользовательских элементов сама по себе является свойством в MainPageViewModel. И вы ясно сказали, что команда, с которой вы хотите связать, также находится в MainPageViewModel.

Таким образом, проблема, которая является очень распространенной, заключается в том, что вы работаете внутри шаблона, связанного с привязкой к коллекции, и поэтому ваш DataContext является пользовательским элементом. Это уже не основной вид-модель. Это замечательно, поскольку вы показываете соответствующие свойства пользовательского элемента, такие как CaseID. Но не очень хорошо, когда вы хотите сбежать на верхний уровень модели представления.

Если то, что я сказал, является правдой, то пользовательский элемент управления ResultsView фактически, вероятно, связан с MainPageViewModel, потому что вы еще не "сверлили" в коллекцию пользовательских элементов. Итак, вам нужно найти способ, используя синтаксис привязки для ссылки на пользовательский элемент управления ResultsView из DataTemplate для ListBox. Если вы можете сделать это, то вы сбежали из коллекции.

Для этого есть два основных подхода:

  • ElementName синтаксис
  • RelativeSource синтаксис

Я опишу ElementName синтаксис, а вы можете посмотреть другой.

Часть 1) Назовите свой ResultsView UserControl элемент следующим образом:

<UserControl ....
    Name="resultsView">
    <!-- ... -->

Часть 2) Внутри DataTemplate, где вы определяете внешний вид гиперссылки, используйте синтаксис ElementName для ссылки на этот элемент:

<TextBlock>
    <Hyperlink Command="{Binding DataContext.ItemDetailsCommand, ElementName=resultsView}"/>
</TextBlock>

Итак, сначала мы используем ElementName, чтобы получить элемент ResultsView UserControl, а затем у нас есть путь из двух частей: первая часть - это свойство DataContext ResultsView, которое дает нам MainPageViewModel (да!), А затем свойство команды, которую мы хотим вызвать.

Это один из способов «избежать» команд привязки и выдачи, найденных на более высоком уровне в модели представления.

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