wake-0
wake-0

Reputation: 3968

UserControl Inheritance WPF

I wanted to implement a base class for my views. This class looks like the following:

public abstract class ViewBase<T> : UserControl, IView where T : ViewModelBase 
{
    protected ViewModelBase viewModel;

    public ViewBase(T viewModel) : base()
    {
        this.InitializeComponent();

        this.viewModel = viewModel;
        this.DataContext = viewModel;
    }

    protected abstract void InitializeComponent();

    public void OnViewCalled(object parameters)
    {
        this.viewModel.OnCalled(parameters);
    }
}

This is the usage of the base class:

public sealed partial class LoginView : ViewBase<LoginViewModel>
{
    public LoginView(LoginViewModel viewModel) : base(viewModel)
    { 
    }
}

The problem is that when I try the above code, I get the following error:

CS1729 C# 'UserControl' does not contain a constructor that takes 1 arguments

Why is not the constructor of the ViewBase class called?

Upvotes: 0

Views: 1426

Answers (1)

Derrick Moeller
Derrick Moeller

Reputation: 4950

It appears you inherited from ViewBase in code behind but UserControl in XAML.

LoginView.xaml

<Local.View:ViewBase x:Class="YourNameSpace.View.LoginView"
                     x:TypeArguments="Local.ViewModel:LoginViewModel"
                     xmlns:Local.View="clr-namespace:YourNameSpace.View"
                     xmlns:Local.ViewModel="clr-namespace:YourNameSpace.ViewModel">
</Local.View:ViewBase>

LoginView.xaml.cs

namespace YourNameSpace.View
{
    public partial class LoginView : ViewBase<LoginViewModel>
    {
        public LoginView(LoginViewModel viewModel)
            : base(viewModel)
        {
            InitializeComponent();
        }
    }
}

ViewBase.cs

namespace YourNameSpace.View
{
    public abstract class ViewBase<T> : UserControl
        where T : ViewModelBase
    {
        protected ViewModelBase ViewModel;

        public ViewBase(T viewModel)
            : base()
        {
            ViewModel = viewModel;
            DataContext = ViewModel;
        }
    }
}

Upvotes: 3

Related Questions