在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,而不是通过后面的代码?

在ItemsControl中的DataTemplate中找到列表框

您绝对不希望VM知道视图。MVVM的关键在于将视图和逻辑解耦。

相反,

处理代码隐藏中的删除。有些人似乎认为MVVM中不应该有代码滞后,但只要它是特定于视图的,并且没有VM逻辑,它就绝对没问题。

假设你已经为你的VM连接了一个全新的视图,比如说一个基于控制台的文本视图。如果您的视图逻辑与一个全新的视图保持完整,因为它都在VM中,那么您就可以了。如果代码背后的逻辑在更改视图时会消失,那么您需要将该逻辑移到VM中。

拖放是可以的。您处理代码隐藏中的删除,然后调用VM来执行与删除相关的逻辑,例如通过绑定命令。如果将视图替换为文本视图,则可以使用CTRL-V来删除,但是将调用相同的VM命令来执行与删除相关的逻辑。

如前所述,从代码隐藏调用VM的一种方法是在视图上有一个依赖属性,该属性绑定到VM中的命令,而您的代码隐藏只是通过该属性调用命令。

一种更简单的方法是将DataContext强制转换为VM类型并直接调用函数。很多人不喜欢这样,因为它将视图与VM类型耦合在一起,但我认为这完全没有问题。无论如何,视图已经耦合到VM上的所有绑定属性。VM应该是与视图无关的,但是视图需要了解VM才能发挥作用。