在ItemsControl中的DataTemplate中找到列表框
本文关键字:列表 ItemsControl 中的 DataTemplate | 更新日期: 2023-09-27 18:04:47
要创建我自己的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,而不是通过后面的代码?
您绝对不希望VM知道视图。MVVM的关键在于将视图和逻辑解耦。
相反,处理代码隐藏中的删除。有些人似乎认为MVVM中不应该有代码滞后,但只要它是特定于视图的,并且没有VM逻辑,它就绝对没问题。
假设你已经为你的VM连接了一个全新的视图,比如说一个基于控制台的文本视图。如果您的视图逻辑与一个全新的视图保持完整,因为它都在VM中,那么您就可以了。如果代码背后的逻辑在更改视图时会消失,那么您需要将该逻辑移到VM中。
拖放是可以的。您处理代码隐藏中的删除,然后调用VM来执行与删除相关的逻辑,例如通过绑定命令。如果将视图替换为文本视图,则可以使用CTRL-V来删除,但是将调用相同的VM命令来执行与删除相关的逻辑。
如前所述,从代码隐藏调用VM的一种方法是在视图上有一个依赖属性,该属性绑定到VM中的命令,而您的代码隐藏只是通过该属性调用命令。
一种更简单的方法是将DataContext强制转换为VM类型并直接调用函数。很多人不喜欢这样,因为它将视图与VM类型耦合在一起,但我认为这完全没有问题。无论如何,视图已经耦合到VM上的所有绑定属性。VM应该是与视图无关的,但是视图需要了解VM才能发挥作用。