要创建我自己的drophandler,我需要访问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>
如何通过ViewModel访问ItemsControl中的ListBox,而不是通过后面的代码?
答案 0 :(得分:0)
您绝对不希望VM知道该视图。 MVVM的重点在于解耦视图和逻辑。
而是处理代码隐藏中的下降。有些人似乎相信MVVM中不应该有代码隐藏,但只要它对视图特定,它就绝对没问题,而且那里没有VM逻辑。
想象一下,您已经为VM创建了一个全新的视图,比如基于控制台的文本视图。如果您的视图逻辑保持完整且具有全新视图,因为它全部位于VM中,那么您就可以了。如果代码隐藏中的逻辑在您更改视图时会消失,那么您需要将逻辑移动到VM。
拖放很好。您处理代码隐藏中的丢弃,然后调用VM以执行与丢弃相关联的逻辑,例如通过绑定命令。如果用文本视图替换视图,则drop可以是CTRL-V,但是将调用相同的VM命令来执行与drop相关联的逻辑。
如上所述,从代码隐藏中调用VM的一种方法是在视图上具有绑定到VM中的命令的依赖项属性,您的代码隐藏只需通过属性调用命令。
更简单的方法是将DataContext强制转换为VM类型并直接调用函数。很多人不喜欢这个,因为它将视图耦合到VM类型,但我认为它根本没有问题。无论如何,视图已经耦合到VM上的所有绑定属性。 VM应该是视图不可知的,但视图需要了解VM以便有用。