Prism app shuts down when exception during region creation - wpf

We have an application that throws an UpdateRegionsException while launching. We suspect it has to do with a DataContext not being set properly in our XAML. Has anyone come across this type of problem before?

It seems as though there's a bug with elements such as Checkbox, and DatePicker, and perhaps others. On some cases I'm forced to put the DataContext prefix to my property name. For example,
IsEnabled="{Binding DataContext.TransferOriginalRxInformationNeverFilled, Converter={StaticResource InvertBooleanConverter}}"
If I don't put the DataContext prefix to the binding, the application shuts down during startup giving the following exception:
Microsoft.Practices.Prism.Regions.UpdateRegionsException: An exception occurred while trying to create region objects.
Hope this helps anyone in the future.

Related

Getting NULL when trying to get value from app.config file , WPF , c# [duplicate]

I'm getting an "Object reference not set to an instance of an object" error when I try to reload the Designer for my XAML UserControl. Visual Studio highlights the following line as being the problem:
<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
Width="600" TemplateData="{Binding ElementName=cbo_templates,
Path=SelectedItem.Data, Mode=OneWay}"/>
TemplateDetail is another UserControl. When I view TemplateDetail, its Designer view loads just fine, so I don't think there's a problem there. There is a ComboBox in my XAML named cbo_templates that contains instances of my Template class, which has a Data property (hence SelectedItem.Data). However, if I remove .Data from the Path in the above XAML, I still get the "Object reference" error, so I don't think the problem is that I'm trying to access the Path property on null. Here's my ComboBox XAML just in case:
<ComboBox ItemsSource="{Binding Path=List}" Grid.Row="1" Grid.Column="3"
VerticalAlignment="Center" x:Name="cbo_templates" Width="250"
HorizontalAlignment="Left" DisplayMemberPath="Name"
SelectedValuePath="Name" SelectedIndex="0"/>
Getting this error is a real problem because the Design view won't load, so I can't see what my UserControl looks like without running the app. Any idea what could be wrong? It builds fine and I don't see any binding problems in the Build Output.
Edit: here is the constructor code for both UserControls:
Constructor of UserControl with "Object reference" error:
InitializeComponent();
grd_templateList.DataContext = this; // refers to containing <Grid> in XAML
Constructor of UserControl I'm trying to embed, the one whose Design view loads okay:
InitializeComponent();
grd_templateDetail.DataContext = this; // refers to containing <Grid> in XAML
Edit: I tried putting an if (null != grd_templateList) check in the constructors before setting their DataContext properties, but that didn't help--still getting the "Object reference" error when reloading the Designer.
Edit: the List property that the ComboBox uses is a DependencyProperty. I have a default value set in the Register method:
public static readonly DependencyProperty ListProperty =
DependencyProperty.Register(
"List",
typeof(List<Template>),
typeof(TemplateList),
new PropertyMetadata(
new List<Template> { _defaultTemplate }
)
);
Even if I try to initialize List in the constructor for my UserControl, I still get the error when reloading the Designer. I don't think the problem is that List is null or SelectedItem.Data is a bad path.
Edit: okay, even just having this causes my Designer to not load, giving the "Object reference" error:
<local:TemplateDetail Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"
TemplateData="{Binding}"/>
There is something it dislikes about the TemplateData property being bound, apparently.
Edit: to add to the mystery, I can view the Design view of my overall/main Window, which includes the UserControl whose Design view gives me the "Object reference" error. O_o
What Alex says is the way to go. But I think its a little confusing to understand what he is saying.
Assuming you have your project open in Visual Studio, open another Visual Studio instance and select Debug->Attach To Process. In the dialog which opens select
XDesProc.exe (which is the XAML UI Designer) for VS2012 and newer or
devenv.exe for older VS versions.
Then do "Reload Designer" for the user control and see the output in the second VS instance to check what exactly is the error.
If you have 'Object reference not set to an instance of an object' in XAML, but your application compiles and runs fine, you will usually find out that its cause is something in a constructor that can't be resolved at design time.
While you can find out the root of the problem with the help of other answers to this question, sometimes that is something you can't simply fix, you need it in your code exactly as you have it, but you don't want to see this error.
In this case, just click the "Disable project code" button located on the bottom of your designer view and Visual Studio designer will stop trying to construct an instance to provide design time data view.
See here for detailed information.
It's probably something in the constructor of your user controls. VS2008 WPF designer appears have some issues with this.
In a project we took over, we added:
if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
return;
}
to the beginning of the constructor of the user controls where this happens to avoid that error.
If your user control throws exception at design time, you can debug it. To do this, open Dll project with this user control in Visual Studio. Select another Visual Studio instance as executable for debugging. Start debugging. In the second (debugged) Visual Studio instance use your user control in the client XAML page. By this way, you can debug user control in design mode.
This thread is a little old, but I had a problem I just solved with its help, so I may be able to slightly clarify some points.
Have your solution loaded in Visual Studio as usual.
Open a 2nd instance of VS, menu debug/attach to process/select devenv.
You should see nothing spectacular! In VS 2010, i just get
"Disassembly cannot be displayed in run mode."
Go back to your 1st instance, where your solution is opened. Load or reload the offending XAML
file. If you have a problem (I had an exception on a user control, so I could not load that window), the debugger should point the offending code in the 2nd instance. in my case, it was very
clear and obvious.
To prevent the offending code from running at design time, I used
If System.ComponentModel.LicenseUsageMode.Runtime = 1 Then
myObject = New ObjectDefinition
End If
Works perfectly well.
In Visual Studio 2015 for WPF:
Hover with your mouse over the "Object reference not set to an instance of an object" in the Design view.
Wait a (few) second(s) and you will see a popup
Select "View Exception Details" (you will also see "View Code" and "Delete this element"
This dialog will show you the exception and the StackTrace
Hope this helps.
If you do this on the XAML you will just see the exception but not the popup with "View Exception Details", thus you need to do it in the Designer/Design view.
I was able to solve the problem after giving a name to an object. It is VS2015, and my markup is different, but it could help somebody too:
<ResourceDictionary>
<DataTemplate x:Key="ThisKeySolvesDesignersNullRef"
DataType="local:MyViewModel">
<local:MyControl/>
</DataTemplate>
</ResourceDictionary>
I was having this error today after editing a lot of XAML in my UWP code and I couldn't figure out what was wrong... but after some close inspection, I noticed this mistake I had made:
<Button Click="{Binding MyCommand}" />
I assigned my Command to the Click handler by mistake, and that resulted in a null reference exception... After changing Click to Command, the error went away.
XAML error reporting needs to be improved!
I just had this problem with VS2022 (17.3.3). I tried to attach from another instance of VS but it never came up with the exception. I tried everything I could find such as handling the design case of the constructor and clearing out the .vs directory. Nothing helped. Finally I tried to run the application. The error didn't show when running. After running, the issue seems to be gone now. Even when I close and reopen the solution I don't see it anymore.

Exception (validation) handling in WPF DataGrid

If the binding engine cannot convert the entered text into the bound property's data type in a DataGridTextColumn (binding below), the cell gets a red border, and you cannot edit any other cells until the error is fixed. The border remains even if you tab out of the cell.
<DataGridTextColumn Binding="{Binding IntegerProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnExceptions=True}" />
This is all great in my setup. The problem is that if I throw an exception in a property setter, the behavior is different. First the red border (validation error) is removed immediately when I tab out from the cell and I can continue to edit the rest of the grid's cells.
Is there any way to make the exception thrown in property setter behave similarly as the binding engine's way of handling FormatExceptions? The biggest annoyance is that the validation error is removed after moving out from the cell.
I think you should NOT throw an exception in a property setter.
Take control of the validation by creating your own ValidationRules objects.
This might help you or you might be beyond this.
http://www.wpfsharp.com/2012/02/03/how-to-disable-a-button-on-textbox-validationerrors-in-wpf/
When the exception is in the UI, the invalid value is not even passed through to the bound property.
Also, you can handle the exception instead of just throwing it and set the property to a default value or clear it out or something.
There's nothing wrong with throwing an exception in a setter. After all, some setters call validation or other procedures while they're being set. For example, I may have a Connected property for a database that attempts to open a database connection when set to true. This could be set to a toggle button on my wpf window. That said, you could create a listener--something similar to this link: http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors.
In my case, I'm using MVVM and Prism/Unity framework. Once I retrieve the value and either trap an exception or raise one, I call an internal event within my View Model called NotifyViewOfException. I pass in the exception object and it handles it from there by displaying a window. You don't have to use Prism/Unity to do this. Based on your description, I don't know what you're using so I won't go into detail about that piece of it.

Does Window.DataContext and Window.Resource ObjectDataProvider conflict

I'm still getting comfortable with WPF, so this might be a silly question. I'm tracking the source of a tab control issue and discovered that I don't know the answer to the question in the title.
My Mvvm-Lite project template put the usual in the Windows opening tag:
DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
And from somewhere else (I really don't remember) I have this handy static resource:
<ObjectDataProvider x:Key="src" ObjectType="vm:MainViewModel" />
While I'm troubleshooting my tab control issue (I won't bore you with those details here) I realized that I didn't know if these two ways of pointing to the view model confilicted in any way. Two separate instances of the view model? I don't think so cause the ViewModelLocator is holding a static reference to Main. Anyway, I just wanted to be sure that I haven't made a "greenie" mistake.
Thanks,
Jim
I am pretty sure that this is going to create two different instances. You can easily verify this by placing a breakpoint in the MainViewModel constructor and running your application in debug mode.
ObjectDataProvider was introduced before MVVM was popular. I would argue that many objects in WPF are kind of obsoleted by MVVM, because now we create these objects and properties in code in the ViewModel layer. In your case, I guess that you probably don't need the ObjectDataProvider, but can use the ViewModelLocator.Main everywhere instead.
Cheers,
Laurent

DesignTime only Error: WPF "StaticExtension" exception

I have this ComboBox
<ComboBox Name="company" Width="120"
HorizontalAlignment="Right" Margin="5"
IsSynchronizedWithCurrentItem="True"
ItemsPanel="{DynamicResource Virtualized}"
ItemsSource="{x:Static local:Repository.Customers}"
SelectedItem="{Binding Path=SelectedCustomer}"
DisplayMemberPath="CM_FULL_NAME""/>
It runs. It works. Except in the designer, which won't let me do anything because of the error:
ArgumentException was thrown on "StaticExtention": Exception has been thrown by the target of an invocation.
Detail
The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.
I have tried several things in the static class to skip the constructor in designtime, none of which fix the error:
if (LicenseManager.UsageMode == LicenseUsageMode.DesignTime)
if (DesignerProperties.GetIsInDesignMode(this))
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Contains("VisualStudio"))
And returning in the constructor if any of these are true. Still getting the error.
Edit: Not sure if it makes any difference, but the static repository class uses EF4 to get from a database.
Edit2: Also tried ItemsSource {Binding} to the static lists, still get the same error. Note, calling it a repository is a misnomer, the lists are loaded on startup and never changed. Below answer does not work, still trying to figure this out.
Edit3: Thomas' Suggestion to debug design mode wasn't doable. I am using VS2010 Express, and the tools menu does not have an attach to process option. I still don't know why this breaks the designer and works in runtime.
In the getter of the Customers property, try to add this code:
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return null;
Thomas answer:
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return null;
Works in the static constructor.

How does the binding work in WPF/XAML?

How does the binding work in xaml when we mention a property name even if the property doesn't exist, the code doesn't break, how and why is that?
WPF swallows binding exceptions. If you run with the debugger attached and look at your output window, you will see error messages being traced for binding failures.

Resources