В моя проект имам Listbox, който използва шаблон за данни. В този шаблон за данни имам бутон. Когато списъкът генерира резултати, източникът на елемент за този списък е зададен на някаква колекция от свойства, нека го наречем Резултати[0].
Проблемът, който имам, е, че когато щракна върху бутона за извикване на метод от модела на изгледа, методът не може да бъде намерен, защото извикването търси контекста на списъка, а не основния изглед. Използвам набор от инструменти SimpleMVVM, който използва локатор, подобен на инструментариума MVVMLight.
Един подход, който предприех, беше изрично да задам контекста на данните на бутона, като декларирам модела на изглед в ресурсите за потребителски контрол и го задам статично.
<UserControl.Resources>
<formatter:HighlightConverter x:Key="FormatConverter" />
<vml:SearchViewModel x:Key="vm" />
</UserControl.Resources>
и след това бутонът съдържа
<HyperlinkButton HorizontalAlignment="Left"
Click="Button_Click"
Content="{Binding Type}"
Style="{StaticResource ListBoxtTitleHyperlink}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction MethodName="GetDetailID" TargetObject="{Binding Source={StaticResource vm}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</HyperlinkButton>
Това работи във факта, че вече мога да получа достъп до метода, но той създава нов модел на изглед, вместо да ми позволи достъп до основния изгледмодел на изгледа. Следователно губя всички свойства, които може да съм имал в предишния модел на изглед, така че не мога да ги предам на метода като параметри.
Моята реализация може да е изключена тук. Така че съм отворен за предложения. В сценарии като този кой е най-добрият подход да имате бутон в шаблон с данни в списъчно поле, който да извиква метод от модела на изгледа и да предава параметрите на метода, които са извлечени от избрания елемент от списъчно поле?
За да видите пълното внедряване на кода, можете да изтеглите примерния проект от Папка на SkyDrive
Актуализация Започвам награда за този въпрос, тъй като ме озадачи. Чувствайте се свободни да изтеглите примерния проект за справка. За по-голяма яснота намерението на този въпрос е да научите как да постигнете следното 1. Изберете ред от списъчно поле 2. Събитието selectionchanged ще зададе свойство на текстовата стойност, показана в потребителския интерфейс (двупосочно обвързване на RecordID с помощта на Inotify 3. Щракнете върху бутона в шаблона на елемента и извикайте метода, съхранен в ViewModel, като използвате тригери за взаимодействие и показване в кутия за съобщения стойността на свойството RecordID.
Стъпки I и 2 са направени. Там, където съм заседнал, е да разбера как да накарам бутона, който е част от шаблона на елемент от списъчната кутия, да намери основния модел на изглед и да извика метода на тази виртуална машина, без да инстанцира нов ViewModel, който би нулирал всички съхранени преди това свойства.
Благодаря предварително