开发者

How to debug binding in WPF

开发者 https://www.devze.com 2023-03-23 08:36 出处:网络
I have a VS2008, C# WPF, Excel AddIn; Under some case, My addin throws exception like A first chance exception of type \'System.InvalidOperationException\' occurred in PresentationFramework.dll

I have a VS2008, C# WPF, Excel AddIn; Under some case, My addin throws exception like

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

but I could not locate where the exception comes from. I know it is b/c data binding. but unable to find out where. Each time I step in, VS tracks to a method which executes w/o error, then after that, the exception throws and but no clue of which line of code.

I have been struggling this for days and could not make a little progress. Pls help out. thanks

Edit, it is too long to fit in comment. So I just put xaml file here. @xmal file that throws the exception. It is DataGridComboBoxColumn that throws the exception

<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}"
                        Displ开发者_JAVA百科ayMemberPath="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>

Edit: here is stack trace

Name:NullReferenceException Message:Object reference not set to an instance of an object. 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) at Microsoft.Windows.Controls.DataGridRow.PrepareRow(Object item, DataGrid owningDataGrid) at Microsoft.Windows.Controls.DataGrid.PrepareContainerForItemOverride(DependencyObject element, Object item) at System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.PrepareItemContainer(DependencyObject container, Object item) at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.PrepareItemContainer(DependencyObject container) at System.Windows.Controls.VirtualizingStackPanel.InsertContainer(Int32 childIndex, UIElement container, Boolean isRecycled) at System.Windows.Controls.VirtualizingStackPanel.AddContainerFromGenerator(Int32 childIndex, UIElement child, Boolean newlyRealized) at System.Windows.Controls.VirtualizingStackPanel.BringIndexIntoView(Int32 index) at Microsoft.Windows.Controls.DataGrid.ScrollRowIntoView(Object item)

at Microsoft.Windows.Controls.DataGrid.OnScrollIntoView(Object arg)

at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)

at System.Windows.Window.ShowHelper(Object booleanBox) at System.Windows.Window.Show() at System.Windows.Window.ShowDialog()


I am not sure about the cause of your problem but here are some links on How you can debug the WPF bindings -

How can I debug WPF bindings? http://www.zagstudio.com/blog/486 (WayBackLink)

Debugging Data Bindings in a WPF or Silverlight Application http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx (WayBackLink)

WPF Snippet - Detecting Binding Errors
http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors (WayBackLink)

Debug Databinding Issues in WPF
http://www.wpftutorial.net/DebugDataBinding.html


Wpf catches binding exceptions so they won't normally trigger the debugger to break. You can have them always break by using the Debug\Exceptions menu command in VS, click Find, type the exception you are seeing (e.g. System.InvalidOperationException). Click Ok, and the dialog should scroll down to that exception. Tick the checkbox in the "Thrown" column and VS should then break on whatever line of code is throwing the original exception when you are debugging.

This will catch all exceptions of that type - even ones you are explicitly catching in a Try Catch block so remember to untick that box when you are done debugging or you'll end up wondering why VS is breaking on exceptions that are being caught.

0

精彩评论

暂无评论...
验证码 换一张
取 消