WPF:从树的不同“分支”调用方法

时间:2010-05-12 10:09:57

标签: c# wpf pixelsense

嘿,我正在做一个WPF应用程序。

树看起来像这样:

SurfaceWindow --- Startscreen
..........................--------页面----------子页面

我正在尝试从Startscreen的“Code Behind”中的“Subpage”调用一个方法(Startscreen.xaml.cs)。

Subpage中的方法如下所示:

public void showTheme(ThemeViewModel主题)         {            ...     }

如果知道我在“页面”或“SurfaceWindow”上可以调用它,因为它位于树的同一“分支”中,我只是做这样的事情:

        ThemeViewModel theme = (ThemeViewModel)mvm.CurrentItem.ThemeViewModel;
        katalog.katalogblatt.showTheme(theme);

但是当我不在树的同一分支上并且想要调用该方法时,我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

你能提供更多细节吗?你的术语可能意味着各种各样的事情假设你想要在父控件之外的一个名为'katalogBlatt'的控件上调用一个名为'showTheme'的方法,那么你需要在父控件上公开一个方法来调用子控件方法:

public void ShowTheme(ThemeViewModel theme)
{
   this.katalogBlatt.ShowTheme(theme)
}

并将其命名为:

page.ShowTheme(theme)

或者您需要将控件公开为父公共属性:

public <controlType> Catalog
{
   get
   {
      return katalogBlatt;
   }
}

并将其命名为:

page.Catalog.ShowTheme(theme);

答案 1 :(得分:1)

我会在J Rothe的评论中说你的术语令人困惑。不过,我也会对此进行抨击。

在我看来,您希望“StartScreen”上的某个事件可以在“子页面”上调用方法。如果有多个“子页面”,这就引出了一个问题。我们假设您想要全部调用它们。

我建议的技术是你的“子页面”绑定到一些全局数据,以了解它应该在任何给定时间显示哪个视图。我通常更喜欢数据绑定,所以我先说明一下。

使用数据绑定执行此操作的最简单方法是在Application对象(或其他一些静态对象)中使用属性作为当前主题。任何更改主题的代码都不会调用subpage.ShowTheme(),而只是更新主题属性:

MyApp.Current.Theme = theme;

现在,Subpage可以使用数据绑定将主题绑定到其默认样式的某个属性中:

<Style TargetType="my:Subpage">
  <Setter Property="Theme" Value="{Binding Theme, Source={x:Static my:MyApp.Current}}" />
</Style>

在Subpage的Theme属性的定义中,使用PropertyChangedCallback更新视图:

public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register("Theme", typeof(MyTheme), typeof(Subpage), new PropertyMetadata
{
  PropertyChangedCallback = (obj, e) =>
  {
    ((Subpage)obj).SetTheme((Theme)e.NewValue);
  }
});

通常,这是查看更改等内容的最佳方式,但有时您希望传播事件。通常这可以使用如下命令完成:

command.Execute(null, Keyboard.FocusedElement);

但这仅在焦点设置在目标内某处时才有效。在您的情况下,您希望将命令发送到特定窗口。如果您只有一个Subpage控件,它可以订阅应用程序对象中的事件:

public Subpage()
{
  MyApp.Current.SwitchTheme += (obj, e) => setTheme(e.NewTheme);
}

和主题更改事件将是:

MyApp.Current.SwitchTheme(null, new ThemeChangeEventArgs { NewTheme = theme });

同样,如果可能的话,我会使用数据绑定技术。