来自以编程方式添加的UserControl中的父页面的UWP(XAML / C#)访问方法

时间:2016-06-15 12:45:52

标签: c# uwp-xaml

我创建了一个UWP XAML页面,我以编程方式添加UserControl,然后显示在ContentControl中。

UserControl control = new Views.PlayingGameScreen();
this.ContentControl.Content = control;

我想知道如何从UserControl访问父页面中的方法。

2 个答案:

答案 0 :(得分:1)

我认为最干净的方法是在UserControl上公开父设置的属性。

public partial class PlayingGameScreen : UserControl
{
   public ICommand Command { get; set; }

   public void SomeMethod()
   {
       this.Command?.Execute(null);
   }
}

//parent code, define the command with the logic to run
var command = new DelegateCommand(...);
var control = new Views.PlayingGameScreen
{
    Command = command
};
this.ContentControl.Content = control;

通过这种方式,父级设置Command,而UserControl不需要知道托管父级是什么,并且UserContol没有使用全局类。这是一个完全解耦的解决方案。

Bonus,将Command设置为DependencyProperty,然后它也可以在xaml中分配。您可以将Command绑定到ViewModel,ViewModel将是Page的ViewModel。

<uc:PlayingGameScreen Command="{x:Bind SomeCommand}"/>

我尝试了很多不同的方式,这是我的最爱。

答案 1 :(得分:0)

从我对UWP的小经验(1个应用程序和计数:D): 您可以将ParentPage的引用保留在类的静态属性中,我们将其命名为PagesGateway.cs

静态类代码:

public static class PagesGateway
{
public static ParentPage ParentPage {get; set;}
}

然后在您的ParentPage后面的代码中,您需要设置引用:

    public partial ParentPage:Page
    {
       public ParentPage{
       PagesGateway.ParentPage = this;
    }

}

这样您就可以在任何地方访问ParentPage个实例方法。 但我觉得那不是最好的做法。但是我使用它来从任何地方访问我的ViewModels,并且它完美地工作,但你必须考虑到它使ViewModel的可重用性无效