Sirwan Afifi
Sirwan Afifi

Reputation: 10824

How to access UserControl's DataContext from another UserControl?

I'm working on a legacy application that's written using Silverlight 5, The application contains lot's of anti-patterns and bad practices. I'm responsible for adding real-time interactions (such as notification) using SingalR.
By the way, They're using these WCF RIA Services for interacting with authentication.

They have a Main page, this page is the place where I'm getting user's notification and show them for logged in users:

public partial class MainPage : UserControl
{
    public MainPage()
    {
       InitializeComponent();
       //...

    }
}

So as you can see I didn't set DataContext property as long as user is logged in, I need to set MainPage's DataContext after a user logs in to application, So I have to do that in LoginOperation_Completed inside LoginForm page:

public partial class LoginForm : StackPanel
{
   private LoginRegistrationWindow parentWindow;
   private LoginInfo loginInfo = new LoginInfo();
   public LoginForm()
   {
       InitializeComponent();
       //...
   }

   private void LoginOperation_Completed(LoginOperation loginOperation)
   {

    if (loginOperation.LoginSuccess)
    {
            // Here I need to access MainPages's DataContext property and set it with my ViewModel
    }
   }
}

Now my question is that, how can I set MainPage's DataContext property inside another class (in this case LoginFrom)?

I have also tried to give an ID to my MainPage user control and access it like this:

mainPage.DataContext = new NotificationItemViewModel();

But the compiler gives me this error:

The name 'mainPage' does not exist in the current context

Upvotes: 1

Views: 802

Answers (2)

Sirwan Afifi
Sirwan Afifi

Reputation: 10824

I finally figured out How to solve my question, There is a simple way to achieve this, I should have created the static instance of the MainPage class in the class itself:

public partial class MainPage : UserControl
{
    public static MainPage Instance { get; private set; }
    public MainPage()
    {
        InitializeComponent();
        Instance = this;
    }
}

Now I can access to the MainPage's DataContext this way:

MainPage.Instance.DataContext = new NotificationItemViewModel();

Upvotes: 2

Gromy
Gromy

Reputation: 258

You need to name your MainPage UserControl where you pasted it in LoginForm XAML. Not in the definition of MainPage.

Upvotes: 0

Related Questions