簡體   English   中英

如何在WPF中調試綁定

[英]How to debug binding in WPF

我有一個VS2008,C#WPF,Excel AddIn; 在某些情況下,我的插件會拋出異常

A first chance exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
A first chance exception of type 'System.NullReferenceException' occurred in PresentationFramework.dll

但我找不到異常的來源。 我知道這是b / c數據綁定。 但無法找出原因。 每次我介入時,VS都會跟蹤一個執行w / o錯誤的方法,然后拋出異常,但不知道哪行代碼。

我這幾天一直在苦苦掙扎,無法取得一些進展。 請幫忙。 謝謝

編輯,它太長,不適合評論。 所以我把xaml文件放在這里。 拋出異常的@xmal文件。 拋出異常的是DataGridComboBoxColumn

<UserControl x:Class="View.BasketView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" >
    <UserControl.Resources>
        <sharedC:FunctionToHiddenVisibility x:Key="enumSRToVis"/>
        <sharedC:FunctionToHiddenVisibility x:Key="enumCSToVis"/>
        <Style x:Key="DataGridRowStyle"  TargetType="{x:Type dg:DataGridRow}">
            <Style.Triggers>
                <Trigger Property="AlternationIndex" Value="1" >
                    <Setter Property="Background" Value="Beige" />
                </Trigger>
            </Style.Triggers>
            <Setter Property="AllowDrop" Value="True" />
            <Setter Property="Margin" Value="0 2 0 2" />            
        </Style>
        <Style x:Key="DataGridStyle" TargetType="{x:Type dg:DataGrid}">
            <Setter Property="AlternationCount" Value="2" />
            <Setter Property="RowStyle" Value="{StaticResource DataGridRowStyle}" />
        </Style>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Trigger Property="MenuItem.IsHighlighted" Value="True" >
                    <Setter Property="BorderBrush" >
                        <Setter.Value>
                            <SolidColorBrush Color="Gray"></SolidColorBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="BorderThickness" Value="1"/>
                </Trigger>
            </Style.Triggers>
        </Style>        
    </UserControl.Resources>
    <GroupBox>
        <GroupBox.Header>
            <TextBlock FontSize="14" FontFamily="Verdana" Text="{Binding Header,Mode=OneWay}"></TextBlock>
        </GroupBox.Header>

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="33"></RowDefinition>
                <RowDefinition Height="*" ></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>

            <Border Margin="2 2 2 0">
                <Grid>

                    <Menu Background="Transparent">
                        <Menu.Resources>
                            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
                        </Menu.Resources>
                        <MenuItem IsEnabled="{Binding IsItemSelected}" Click="EditClick" ToolTip="Edit Relation(s)" Background="Transparent">
                            <MenuItem.Header>
                                <Image Width="16" Height="16" Source="{Binding EditImageFilePath}"/>
                            </MenuItem.Header>
                        </MenuItem>
                        <MenuItem IsEnabled="{Binding IsItemSelected}" Click="DeleteClick" ToolTip="Delete Relation(s)" Background="Transparent">
                            <MenuItem.Header>
                                <Image Width="16" Height="16" Source="{Binding DeleteImageFilePath}"/>
                            </MenuItem.Header>
                        </MenuItem>
                    </Menu>                             
                </Grid>
            </Border>

            <dg:DataGrid Grid.Row="1" x:Name="basketDG" Margin="5 0 5 0" Background="White"
                  AutoGenerateColumns="False" 
                  Style="{StaticResource DataGridStyle}"
                  SelectionMode="Extended"
                  GridLinesVisibility="None"
                  HeadersVisibility="Column" RowDetailsVisibilityMode="VisibleWhenSelected"
                  ItemsSource="{Binding BasketItems, Mode=OneWay}" CanUserAddRows="False" CanUserDeleteRows="False"
                  SelectionUnit="FullRow" SelectedItem="{Binding SelectedRelComplete}" 
                  VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"
                  SelectionChanged="BasketDgSelectionChanged"                  
                  Drop="DataGridDrop" 
                  DragEnter="DataGridDragEnter" 
                  AllowDrop="True"
                 >

                <!-- Column definition -->
                <dg:DataGrid.Columns>
                    <dg:DataGridTextColumn IsReadOnly="True" Width="100" Header="Symbol" Binding="{Binding Name}" >
                        <dg:DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextWrapping" Value="Wrap" />
                            </Style>
                        </dg:DataGridTextColumn.ElementStyle>
                    </dg:DataGridTextColumn>              

                    <dg:DataGridTextColumn IsReadOnly="True" Width="*" Header="Symbol Description" Binding="{Binding Desc}" >
                        <dg:DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextTrimming" Value="WordEllipsis" />
                            </Style>
                        </dg:DataGridTextColumn.ElementStyle>
                    </dg:DataGridTextColumn>

                    <dg:DataGridComboBoxColumn Width="200" Header="Column" 
                        SelectedValueBinding="{Binding Path=RelParams.ColumnName, UpdateSourceTrigger=PropertyChanged}"
                        DisplayMemberPath="cName"
                        SelectedValuePath="cName">
                        <dg:DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding RelInfo.Columns}" />
                            </Style>
                        </dg:DataGridComboBoxColumn.ElementStyle>
                        <dg:DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding RelInfo.Columns}" />
                            </Style>
                        </dg:DataGridComboBoxColumn.EditingElementStyle>
                    </dg:DataGridComboBoxColumn>

                </dg:DataGrid.Columns>               

            </dg:DataGrid>

            <Grid Grid.Row="2" Margin="0 5 0 0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" ></ColumnDefinition>
                    <ColumnDefinition Width="Auto" ></ColumnDefinition>
                    <ColumnDefinition Width="5" ></ColumnDefinition>
                    <ColumnDefinition Width="Auto" ></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Grid.Column="0">
                    <Button Name="BtnSR" Visibility="{Binding SelectedFunction,  Converter={StaticResource enumSRToVis}}" IsEnabled="{Binding ItemsExist}" Margin="2" Click="ShowBasketSettings">Basket Settings</Button>
                </StackPanel>
                <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Grid.Column="0">
                    <Button Name="BtnCS" Visibility="{Binding SelectedFunction,  Converter={StaticResource enumCSToVis}}" IsEnabled="{Binding OnlyOneFutureItemExist}" Margin="2" Click="ShowCreateCurve">Curve Settings</Button>
                </StackPanel>
                <StackPanel Grid.Column="1">
                    <Button Width="50" Name ="BtnClear" ToolTip="Clear Basket" Margin="2" IsEnabled="{Binding ItemsExist}"
                            Click="BtnClear_Click">Clear</Button>
                </StackPanel>
                <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Grid.Column="3">                 
                    <Button Visibility ="{Binding ElementName=BtnSR, Path=Visibility}" 
                            ToolTip="Send Series Data to Table"
                            Name="SendToTable" Margin="2" Command="{Binding SendToTableCommand}" 
                            CommandParameter="{Binding ElementName=SendToTable}">Send to Table</Button>
                </StackPanel>
                <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Grid.Column="3">
                    <Button Visibility="{Binding ElementName=BtnCS, Path=Visibility}" 
                            Name="CreateCurveSurface" Margin="2"                             
                            ToolTip="Send Curve Surface to Table"
                            IsEnabled="{Binding OnlyOneFutureItemExist}"
                            Click="CreateCurveSurfaceClick"
                    >Send to Table</Button>
                </StackPanel>
            </Grid>
        </Grid>
    </GroupBox>
</UserControl>

編輯 :這是堆棧跟蹤

名稱:NullReferenceException消息:未將對象引用設置為對象的實例。 Target:Void RestoreAttachedItemValue(System.Windows.DependencyObject,System.Windows.DependencyProperty)Stack:at Microsoft.Windows.Controls.DataGridRow.RestoreAttachedItemValue(DependencyObject objectWithProperty,DependencyProperty property)at Microsoft.Windows.Controls.DataGridRow.SyncProperties(Boolean forcePrepareCells)在System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost上的Microsoft.Windows.Controls.DataGrid.PrepareContainerForItemOverride(DependencyObject元素,Object項)的Microsoft.Windows.Controls.DataGridRow.PrepareRow(Object item,DataGrid owningDataGrid)處System.Windows.Controls.VirtualizingStackPanel.InsertContainer(Int32 childIndex,UIElement容器,System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.PrepareItemContainer(DependencyObject容器)中的.PrepareItemContainer(DependencyObject容器,Object項)。 System.Windows.Controls.VirtualizingStackPanel上的Boolean isRecycled) Microsoft.Windows.Controls.DataGrid.ScrollRowIntoView(Object item)的System.Windows.Controls.VirtualizingStackPanel.BringIndexIntoView(Int32 index)中的.AddContainerFromGenerator(Int32 childIndex,UIElement child,BooleannewRealized)
在Microsoft.Windows.Controls.DataGrid.OnScrollIntoView(Object arg)
System.Windows上的MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler)上的System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback,Object args,Int32 numArgs) .Threading.Dispatcher.WrappedInvoke(委托回調,Object args,Int32 numArgs,Delegate catchHandler)位於System.Whows上的System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)中的System.Windows.Threading.DispatcherOperation.InvokeImpl()。 System.Threading上System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback回調,對象狀態)的System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode代碼,CleanupCode backoutCode,Object userData)中的ExecutionContext.runTryCode(Object userData)。 System.T上的ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回調,Object狀態,Boolean ignoreSyncCtx) hreading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回調,對象狀態)位於System.Windows.Threading.Dispatcher.ProcessQueue()的System.Windows.Threading.DispatcherOperation.Invoke()處於System.Windows.Threading.Dispatcher.WndProcHook(在MS.Win32.HwndSubclass.DispatcherCallbackOperation(對象o)的MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean&handling)的IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean&handling) )System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback,Object args,Int32 numArgs)at System的MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source,Delegate方法,Object args,Int32 numArgs,Delegate catchHandler)。 System.Windows.Threading.Dispatcher.InvokeImpl中的Windows.Threading.Dispatcher.WrappedInvoke(委托回調,Object args,Int32 numArgs,Delegate catchHandler)(DispatcherPriority優先級,TimeSpan超時,Delegate方法,Objec) 在MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam)的MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG&msg)at System.Windows.Threading.Dispatcher.PushFrameImpl(t args,Int32 numArgs) DispatcherFrame框架)在System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame框架)
在System.Windows.Window.ShowDialog()的System.Windows.Window.Show()上的System.Windows.Window.ShowHelper(Object booleanBox)

我不確定您的問題的原因,但這里有一些關於如何調試WPF綁定的鏈接 -

如何調試WPF綁定? http://www.zagstudio.com/blog/486WayBackLink

在WPF或Silverlight應用程序中調試數據綁定http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspxWayBackLink

WPF Snippet - 檢測綁定錯誤
http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errorsWayBackLink

WPF中的調試數據綁定問題
http://www.wpftutorial.net/DebugDataBinding.html

Wpf捕獲綁定異常,因此它們通常不會觸發調試器中斷。 您可以使用VS中的Debug \\ Exceptions菜單命令讓它們始終中斷,單擊查找,鍵入您看到的異常(例如System.InvalidOperationException )。 單擊“確定”,對話框應向下滾動到該異常。 勾選“Thrown”列中的復選框,然后VS應該在調試時拋出原始異常的任何代碼行。

這將捕獲該類型的所有異常 - 甚至是您在Try Catch塊中明確捕獲的異常,因此請記住在完成調試時取消勾選該框,或者您最終會想知道VS為什么會破壞正在捕獲的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM