Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 更改MainWindow.xaml后ListBox出现DataContext问题_Wpf_Vb.net_Visual Studio 2010_Data Binding_Mvvm - Fatal编程技术网

Wpf 更改MainWindow.xaml后ListBox出现DataContext问题

Wpf 更改MainWindow.xaml后ListBox出现DataContext问题,wpf,vb.net,visual-studio-2010,data-binding,mvvm,Wpf,Vb.net,Visual Studio 2010,Data Binding,Mvvm,这个月我对WPF和MVVM设计模式还不熟悉,一般来说有点脱离实际。为了学习,我一直在玩文本框、矩形以及在窗口中显示它们的方法。我从Ashley Davis优秀的“WPF中的简单拖动选择”教程开始,该教程介绍了为矩形集合创建视图模型、将列表框绑定到所述集合、使用画布设置列表框样式、为矩形创建数据模板以及基本的“橡皮筋”选择逻辑 此后,我在本教程的基础上改进了拖动选择,使其行为更像windows资源管理器中的选择,并允许从角或边调整矩形的大小 一切都很好,直到我更改了MainWindow.xaml,

这个月我对WPF和MVVM设计模式还不熟悉,一般来说有点脱离实际。为了学习,我一直在玩文本框、矩形以及在窗口中显示它们的方法。我从Ashley Davis优秀的“WPF中的简单拖动选择”教程开始,该教程介绍了为矩形集合创建视图模型、将列表框绑定到所述集合、使用画布设置列表框样式、为矩形创建数据模板以及基本的“橡皮筋”选择逻辑

此后,我在本教程的基础上改进了拖动选择,使其行为更像windows资源管理器中的选择,并允许从角或边调整矩形的大小

一切都很好,直到我更改了MainWindow.xaml,试图在侧面包含一列用于各种按钮和控件,从而将“编辑器表面”网格从主窗口上的1x1网格中移动到1x2网格的一列,将数据模板移动到网格的资源中(因为它将是窗口中唯一需要它的元素). 当我这么做的时候,我编写的与listbox交互的子程序开始出现错误——橡皮筋选择不再有效。没有任何视觉指示显示listbox项目正在被选中(它们之前已高亮显示),在拖动选择鼠标点击事件后询问listbox.SelectedItems.Count返回零

经过一些实验,阅读了这个网站上的许多问题和我的WPF发布的书的部分,并浏览了msdn数据绑定概述,到今天早上为止,我仍然找不到我的错误。我认为这是数据绑定错误或不正确的数据上下文

有关所涉及视图模型的一些详细信息:

DataFieldViewModel

…实现INotifyPropertyChanged并公开其(在本例中为矩形和文本框)X、Y位置、宽度、高度、可见性和选择状态的属性(一种跨多个橡皮筋选择操作跟踪它的方法)

页面视图模型

…实现INotifyPropertyChanged,并具有DataFieldViewModel类型的ObservableCollection(称为DataFields),并将其作为只读属性公开

下面是MainWindow.xaml.vb和其中一个损坏的子组件:

Namespace EditorUI


'
' The main window of the editor.
'
Partial Public Class MainWindow
    Inherits Window

    '
    ' Temporary.  Will be replaced with a collection of pages eventually
    '
    Private Pages As PageViewModel
(为简洁起见,其余数据成员和属性被截断)

(这是一个有问题的潜艇)

最后,这里是整个XAML:

<Window x:Class="EditorUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Editor_UI_Experiments.EditorUI"
    Title="Editor UI Experiments" 
    Width="900"
    Height="600"
    Loaded="Window_Loaded" 

    >

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="778*" />
        </Grid.ColumnDefinitions>

        <Button
            Grid.Column="0"
            VerticalAlignment="Top"
            Height="25"
            Content="Explode :D"
            Name="Button1" 

            />

        <Grid
            Name="EditorSurface"
            Grid.Column="1"
            MouseDown="Editor_MouseDown"
            MouseUp="Editor_MouseUp"
            MouseMove="Editor_MouseMove"

            >

            <Grid.Background>
                <ImageBrush ImageSource="{Binding GetPageImage}" />

            </Grid.Background>

            <Grid.DataContext>

                <local:PageViewModel/>

            </Grid.DataContext>

            <Grid.Resources>
                <!--
                A data template that defines the visuals for a data field.
                -->
                <DataTemplate 
                DataType="{x:Type local:DataFieldViewModel}"
                    >
                    <!-- 
                    The data field is embedded in a Grid so that we can set the Margin
                    The margin is set so that the ListBox item selection fits nicely around the Rectangle.
                    -->
                    <Grid
                    Margin="0,2,2,2"
                        >
                        <!-- 
                        text box where the data field's response lives (it could be a Database tag,
                        or a check mark, or custom response)
                        -->
                        <TextBox
                        Width="{Binding Width}"
                        Height="{Binding Height}"
                        Background="LightBlue"
                        Cursor="IBeam"
                        MouseDown="TextBox_MouseDown"
                        MouseUp="TextBox_MouseUp"
                        MouseMove="TextBox_MouseMove"
                        Text="Example Text"
                            />
                        <!-- 
                        rectangle that lives on top of the text field to aid in positioning the data field
                        -->
                        <Rectangle
                        Width="{Binding Width}"
                        Height="{Binding Height}"
                        Stroke="LightBlue"
                        StrokeThickness="5"
                        Fill="White"
                        Opacity="0.5"
                        Cursor="SizeAll"
                        MouseDown="Rectangle_MouseDown"
                        MouseUp="Rectangle_MouseUp"
                        MouseMove="Rectangle_MouseMove"
                        Visibility="{Binding Visibility}"
                            />
                        <!--
                        Thumb "handles" to give the user a way to resize the data field
                        -->
                        <!-- 
                        These four live in the corners of a data field and allow resizing on
                        X and Y simultaneously
                        -->
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Left"
                        Margin="-1,-1,0,0"
                        Cursor="SizeNWSE"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Right"
                        Margin="0,-1,-1,0"
                        Cursor="SizeNESW"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Left"
                        Margin="-1,0,0,-1"
                        Cursor="SizeNESW"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Right"
                        Margin="0,0,-1,-1"
                        Cursor="SizeNWSE"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <!--
                        These four live along the data field's edges and allow resizing in the X
                        or Y direction only.  They have zero opacity to avoid visual clutter
                        -->
                        <Rectangle
                        Height="5"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Stretch"
                        Margin="7,0,7,0"
                        Cursor="SizeNS"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Height="5"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Stretch"
                        Margin="7,0,7,0"
                        Cursor="SizeNS"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="5"
                        VerticalAlignment="Stretch"
                        HorizontalAlignment="Left"
                        Margin="0,7,0,7"
                        Cursor="SizeWE"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="5"
                        VerticalAlignment="Stretch"
                        HorizontalAlignment="Right"
                        Margin="0,7,0,7"
                        Cursor="SizeWE"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />                            
                    </Grid>
                </DataTemplate>

            </Grid.Resources>
            <!--
            This ListBox presents the data fields

            The data template that defines the visuals for each data field is in the 
            resources section at the start of this file.
            -->

            <ListBox
                x:Name="DataFieldListBox"
                ItemsSource="{Binding GetDataFields}"
                SelectionMode="Extended"
                Background="Transparent"

                >
                <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemContainerStyle>
                        <Style
                            TargetType="ListBoxItem"

                            >
                            <Setter
                            Property="Canvas.Left"
                            Value="{Binding X}"

                            />
                            <Setter
                            Property="Canvas.Top"
                            Value="{Binding Y}"

                            />
                        </Style>
                    </ListBox.ItemContainerStyle>
            </ListBox>

            <!--
            Render a drag selection rectangle using a Canvas with a border
            -->
            <Canvas
            x:Name="dragSelectionCanvas"
            Visibility="Collapsed"

                >
                <Border 
                x:Name="selectionRectangleBorder"
                BorderBrush="Blue"
                BorderThickness="1"
                Background="LightBlue"
                CornerRadius="1"
                Opacity="0.5"

                />
            </Canvas>

    </Grid>

</Grid>

我确信我的代码中充满了新手的错误,但到目前为止它还是很有趣的。希望能迅速改进,也许能把它变成有用的东西。最欢迎反馈和见解。如果有人碰巧发现我错在哪里,我会感激你的


-Tom

我怀疑这与您在XAML中定义网格的
DataContext
有关,但是您的拖动事件引用了代码隐藏中的对象。因此,您的
列表框
绑定到
PageViewModel
的XAML副本,而您的代码隐藏正在使用另一个
PageViewModel

我建议从XAML中删除
DataContext
属性,而是在代码隐藏中设置它,例如
Me.DataContext=Pages


请记住,在代码隐藏中设置
DataContext
通常是不好的做法,除非它是应用程序启动代码。

我怀疑这与您在XAML中定义网格的
DataContext
有关,但拖动事件引用了代码隐藏中的对象。因此,您的
列表框
绑定到
PageViewModel
的XAML副本,而您的代码隐藏正在使用另一个
PageViewModel

我建议从XAML中删除
DataContext
属性,而是在代码隐藏中设置它,例如
Me.DataContext=Pages


请记住,在代码隐藏中设置
DataContext
通常是不好的做法,除非它是应用程序启动代码。

我怀疑这与您在XAML中定义网格的
DataContext
有关,但拖动事件引用了代码隐藏中的对象。因此,您的列表框绑定到了
PageViewModel
的XAML副本,而您的代码隐藏正在使用另一个
PageViewModel
Hm副本,我不知道XAML会有一个单独的副本/实例。是否可以通过某种方式将其数据上下文绑定到代码隐藏副本来修复此问题?或者在DataContext=Me的PageViewModel构造函数中这样做…?顺便说一句,我认为网格甚至有一个数据上下文有点奇怪,因为它与数据本身没有任何关系。最终我想要
 '
    ' Select all the data fields that intersect the selection rectangle.
    ' Remove any selected data fields which do not.
    '
    Private Sub ApplyDragSelectionRectangle()

        If (LeftMouseDrag) Then

            Dim selectionRectangle As New Rect(Canvas.GetLeft(selectionRectangleBorder), _
                                               Canvas.GetTop(selectionRectangleBorder), _
                                               selectionRectangleBorder.Width, _
                                               selectionRectangleBorder.Height)

            '
            ' Find and select all the list box items.
            '
            For Each dataFieldViewModel As DataFieldViewModel In Me.Pages.GetDataFields
                Dim hitBox As New Rect(dataFieldViewModel.hbX, _
                                       dataFieldViewModel.hbY, _
                                       dataFieldViewModel.hbWidth, _
                                       dataFieldViewModel.hbHeight)

                If (selectionRectangle.IntersectsWith(hitBox)) Then
                    If (dataFieldViewModel.ExistingSelection) Then
                        '
                        ' data field is already part of an existing selection; unselect it
                        '
                        Me.DataFieldListBox.SelectedItems.Remove(dataFieldViewModel)
                    Else
                        Me.DataFieldListBox.SelectedItems.Add(dataFieldViewModel)
                    End If
                End If
                If Not (selectionRectangle.IntersectsWith(hitBox)) Then
                    If (dataFieldViewModel.ExistingSelection) Then
                        '
                        ' data field was part of an existing selection; reselect it
                        '
                        Me.DataFieldListBox.SelectedItems.Add(dataFieldViewModel)
                    Else
                        Me.DataFieldListBox.SelectedItems.Remove(dataFieldViewModel)
                    End If
                End If

            Next
        Else
            dragSelectionCanvas.Visibility = Visibility.Collapsed
            '
            ' update all data fields' existing selection status to the new
            ' selection (first set them all to false to catch data fields 
            ' that were removed)
            '
            For Each dataFieldViewModel As DataFieldViewModel In Me.DataFieldListBox.Items
                dataFieldViewModel.ExistingSelection = False
            Next
            For Each dataFieldViewModel As DataFieldViewModel In Me.DataFieldListBox.SelectedItems
                dataFieldViewModel.ExistingSelection = True
            Next
        End If

    End Sub
<Window x:Class="EditorUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Editor_UI_Experiments.EditorUI"
    Title="Editor UI Experiments" 
    Width="900"
    Height="600"
    Loaded="Window_Loaded" 

    >

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="778*" />
        </Grid.ColumnDefinitions>

        <Button
            Grid.Column="0"
            VerticalAlignment="Top"
            Height="25"
            Content="Explode :D"
            Name="Button1" 

            />

        <Grid
            Name="EditorSurface"
            Grid.Column="1"
            MouseDown="Editor_MouseDown"
            MouseUp="Editor_MouseUp"
            MouseMove="Editor_MouseMove"

            >

            <Grid.Background>
                <ImageBrush ImageSource="{Binding GetPageImage}" />

            </Grid.Background>

            <Grid.DataContext>

                <local:PageViewModel/>

            </Grid.DataContext>

            <Grid.Resources>
                <!--
                A data template that defines the visuals for a data field.
                -->
                <DataTemplate 
                DataType="{x:Type local:DataFieldViewModel}"
                    >
                    <!-- 
                    The data field is embedded in a Grid so that we can set the Margin
                    The margin is set so that the ListBox item selection fits nicely around the Rectangle.
                    -->
                    <Grid
                    Margin="0,2,2,2"
                        >
                        <!-- 
                        text box where the data field's response lives (it could be a Database tag,
                        or a check mark, or custom response)
                        -->
                        <TextBox
                        Width="{Binding Width}"
                        Height="{Binding Height}"
                        Background="LightBlue"
                        Cursor="IBeam"
                        MouseDown="TextBox_MouseDown"
                        MouseUp="TextBox_MouseUp"
                        MouseMove="TextBox_MouseMove"
                        Text="Example Text"
                            />
                        <!-- 
                        rectangle that lives on top of the text field to aid in positioning the data field
                        -->
                        <Rectangle
                        Width="{Binding Width}"
                        Height="{Binding Height}"
                        Stroke="LightBlue"
                        StrokeThickness="5"
                        Fill="White"
                        Opacity="0.5"
                        Cursor="SizeAll"
                        MouseDown="Rectangle_MouseDown"
                        MouseUp="Rectangle_MouseUp"
                        MouseMove="Rectangle_MouseMove"
                        Visibility="{Binding Visibility}"
                            />
                        <!--
                        Thumb "handles" to give the user a way to resize the data field
                        -->
                        <!-- 
                        These four live in the corners of a data field and allow resizing on
                        X and Y simultaneously
                        -->
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Left"
                        Margin="-1,-1,0,0"
                        Cursor="SizeNWSE"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Right"
                        Margin="0,-1,-1,0"
                        Cursor="SizeNESW"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Left"
                        Margin="-1,0,0,-1"
                        Cursor="SizeNESW"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="7"
                        Height="7"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Right"
                        Margin="0,0,-1,-1"
                        Cursor="SizeNWSE"
                        Fill="LightGray"
                        Stroke="Gray"
                        Opacity="0.6"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <!--
                        These four live along the data field's edges and allow resizing in the X
                        or Y direction only.  They have zero opacity to avoid visual clutter
                        -->
                        <Rectangle
                        Height="5"
                        VerticalAlignment="Top"
                        HorizontalAlignment="Stretch"
                        Margin="7,0,7,0"
                        Cursor="SizeNS"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Height="5"
                        VerticalAlignment="Bottom"
                        HorizontalAlignment="Stretch"
                        Margin="7,0,7,0"
                        Cursor="SizeNS"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="5"
                        VerticalAlignment="Stretch"
                        HorizontalAlignment="Left"
                        Margin="0,7,0,7"
                        Cursor="SizeWE"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />
                        <Rectangle
                        Width="5"
                        VerticalAlignment="Stretch"
                        HorizontalAlignment="Right"
                        Margin="0,7,0,7"
                        Cursor="SizeWE"
                        Fill="Yellow"
                        Opacity="0"
                        Visibility="{Binding Visibility}"
                        MouseDown="Thumb_MouseDown"
                        MouseUp="Thumb_MouseUp"
                        MouseMove="Thumb_MouseMove"

                            />                            
                    </Grid>
                </DataTemplate>

            </Grid.Resources>
            <!--
            This ListBox presents the data fields

            The data template that defines the visuals for each data field is in the 
            resources section at the start of this file.
            -->

            <ListBox
                x:Name="DataFieldListBox"
                ItemsSource="{Binding GetDataFields}"
                SelectionMode="Extended"
                Background="Transparent"

                >
                <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemContainerStyle>
                        <Style
                            TargetType="ListBoxItem"

                            >
                            <Setter
                            Property="Canvas.Left"
                            Value="{Binding X}"

                            />
                            <Setter
                            Property="Canvas.Top"
                            Value="{Binding Y}"

                            />
                        </Style>
                    </ListBox.ItemContainerStyle>
            </ListBox>

            <!--
            Render a drag selection rectangle using a Canvas with a border
            -->
            <Canvas
            x:Name="dragSelectionCanvas"
            Visibility="Collapsed"

                >
                <Border 
                x:Name="selectionRectangleBorder"
                BorderBrush="Blue"
                BorderThickness="1"
                Background="LightBlue"
                CornerRadius="1"
                Opacity="0.5"

                />
            </Canvas>

    </Grid>

</Grid>