2015-07-26 6 views
0

Чтобы создать собственный drophandler, мне нужно получить доступ к списку, который находится внутри элемента ItemsControl.Найти Listbox в DataTemplate внутри ItemsControl

XAML

<ItemsControl ItemsSource="{Binding Days}" Name="myCalendar" Margin="200,75,0,0">   
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Rows="6" Columns="7">      
       </UniformGrid>     
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <!-- ItemTemplate --> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 

        <TextBlock Text="{Binding Date}"> 
        </TextBlock> 

        <ListBox Name="Scenes" ItemsSource="{Binding Scenes}" dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" dd:DragDrop.DropHandler="{Binding}"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock> 
            <Run Text="{Binding Path=SlugLine}"/> 
           </TextBlock> 
          </StackPanel> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 

       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Как получить доступ или найти ListBox внутри ItemsControl от моего ViewModel, а не через код позади?

+2

Вы не должны. ViewModel не должен знать о представлении. – MajkeloDev

ответ

0

Вы абсолютно не хотите знать VM о представлении. Вся цель MVVM - отделить взгляд и логику.

Вместо этого обработайте падение кода. Некоторые люди, похоже, полагают, что в MVVM не должно быть никаких кодов, но это абсолютно нормально, если это специфично для представления, и там нет логики VM.

Представьте, что вы подключили совершенно новый вид к вашей виртуальной машине, скажем, текстовый вид на консоль. Если ваша логика просмотра остается неповрежденной с совершенно новым видом, так как это все в виртуальной машине, тогда вы в порядке. Если у вас есть логика в коде, которая исчезнет при изменении представлений, вам потребуется, чтобы эта логика переместилась на виртуальную машину.

Перетаскивание в порядке. Вы обрабатываете падение кода, а затем вызываете виртуальную машину для выполнения логики, связанной с падением, например, посредством связанной команды. Если заменить представление на текстовое представление, вместо этого вместо него может быть CTRL-V, но одна и та же команда VM будет вызвана для выполнения логики, связанной с падением.

Как уже упоминалось, один из способов вызова виртуальной машины из кода-кода должен состоять в том, чтобы иметь свойство зависимостей в представлении, которое привязано к команде в виртуальной машине, а ваш код-код просто вызывает команду через свойство ,

Проще всего просто передать DataContext вашему типу VM и вызвать функцию напрямую. Многим людям это не нравится, поскольку он соединяет взгляд с типом виртуальной машины, но я вообще не вижу проблемы с ним. В любом случае представление все же связано со всеми связанными свойствами на VM. ВМ следует рассматривать как агностик, но представление НЕОБХОДИМО знать о виртуальной машине, чтобы быть полезным.

+0

Теперь все это имеет для меня больше смысла. Но как мне получить доступ к Listbox, чтобы сделать каплю внутри. Между двумя списками легко, но со списками внутри связанного элемента управления, кажется, гораздо труднее найти drophandler. – Phil