Willem Willem - 3 months ago 125
C# Question

The component does not have a resource identified by the uri

I want to create a Generic DataGrid to use on all my Views/UserControls.

This is my structure:

Class Library
called
"Core"
:

Class
called
"ViewBase"
:

public class ViewBase : UserControl
{
public ViewBase()
{
}

//Rest of Methods and Properties
}


Class Library
called
"Controls"
:

UserControl
Called
"GridView"
:

XAML:

<vb:ViewBase x:Class="Controls.GridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vb="clr-namespace:Core;assembly=Core">

<Grid>
<DataGrid></DataGrid>
</Grid>

</vb:ViewBase>


Code Behind:

using Core;

public partial class GridView : ViewBase
{
public GridView ()
{
InitializeComponent();
}
}


Then is the WPF Aplication called "WPFApp":

Class
called
"View"
:

using Controls;

public class View : GridView
{
public View()
{
InitializeComponent();
}
}


My whole idea is to use
GridView
where i need a
DataGrid
.

When i run the application i get this error:

"The component 'WpfApp.View' does not have a resource identified by the URI '/Controls;component/GridView.xaml'."


What am i doing wrong?

Is this the correct approach or am i way off?

Answer

I was doing something very similar with the same result. I had one C# class library that contained a WPF control called UsageControl (xaml with accompanying xaml.cs file). In a separate C# project(i.e. separate dll) I created a C# class CPUUsageControl which inherited from UsageControl, but put its own spin on it. When i tried to use the CpuUsageControl on one of my views i got the same error you did.

What i did to fix that was in my seperate assembly, instead of creating a class that inherited from the base control, i created a new WPF Control that contained the base control. I then put all of the logic that was contained in the CpuUsage class into the WpfCpuUsageControl's code behind. I was able to use this object is all of my other controls just fine.

For your Control "GridView" i would create a new WPF user control, call it GridView and make it contain a "ViewBase" as the content of the Grid control.Inside of the ViewBase's content put in your DataGrid, like this:

<UserControl....>
    <Grid>
        <ViewBase name="vBase">
            <DataGrid name="dGrid" />
        </ViewBase>
    </Grid>
</UserControl>

It is also not apparent to me that you need ViewBase to inherit from UserControl directly. If all you want are for your controls to have certain properties and method why not just make a BaseControl class (that does not inherit from anyone but object) and have future controls inherit from it. Perhaps an abstract base class or interface is what your after.

For MVVM WPF projects, i typically have a BaseViewModel which implements INotifyPropertyChanged for me so i dont have to do that same code everywhere.

Best of luck, i know this problem was a huge pain to figure out. The exception message and google are most unhelpful!

Comments