如何从另一个UserControl访问UserControl的DataContext?

时间:2015-09-19 07:59:22

标签: c# silverlight

我正在研究使用Silverlight 5编写的遗留应用程序,该应用程序包含许多反模式和不良做法。我负责使用SingalR添加实时交互(例如通知) 顺便说一句,他们正在使用these WCF RIA服务与身份验证进行交互。

他们有一个主页面,这个页面是我收到用户通知并向登录用户显示的地方:

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

    }
}

因为你可以看到我没有设置DataContext属性,只要用户登录,我需要在用户登录到应用程序后设置MainPage的DataContext,所以我必须在LoginOperation_Completed里面这样做LoginForm页面:

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
    }
   }
}

现在我的问题是,如何在另一个类(在本例中为LoginFrom)中设置MainPage的DataContext属性?

我还试图为我的MainPage用户控件提供一个ID,并按如下方式访问它:

mainPage.DataContext = new NotificationItemViewModel();

但是编译器给了我这个错误:

  

当前上下文中不存在名称“mainPage”

2 个答案:

答案 0 :(得分:2)

我终于弄清楚如何解决我的问题,有一种简单的方法可以实现这一点,我应该在类本身中创建MainPage类的静态实例:

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

现在我可以通过这种方式访问​​MainPage的DataContext:

MainPage.Instance.DataContext = new NotificationItemViewModel();

答案 1 :(得分:0)

您需要将MainPage用户控件命名为LoginForm XAML中粘贴的位置。不在MainPage的定义中。