在ItemsControl中的DataTemplate中查找列表框

时间:2015-07-26 10:02:16

标签: c# wpf mvvm listbox itemscontrol

要创建我自己的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,而不是通过后面的代码?

1 个答案:

答案 0 :(得分:0)

您绝对不希望VM知道该视图。 MVVM的重点在于解耦视图和逻辑。

而是处理代码隐藏中的下降。有些人似乎相信MVVM中不应该有代码隐藏,但只要它对视图特定,它就绝对没问题,而且那里没有VM逻辑。

想象一下,您已经为VM创建了一个全新的视图,比如基于控制台的文本视图。如果您的视图逻辑保持完整且具有全新视图,因为它全部位于VM中,那么您就可以了。如果代码隐藏中的逻辑在您更改视图时会消失,那么您需要将逻辑移动到VM。

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

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

更简单的方法是将DataContext强制转换为VM类型并直接调用函数。很多人不喜欢这个,因为它将视图耦合到VM类型,但我认为它根本没有问题。无论如何,视图已经耦合到VM上的所有绑定属性。 VM应该是视图不可知的,但视图需要了解VM以便有用。