WPF: Вызов метода от другого “ответвления” дерева

Эй, я делаю Приложение WPF.

Дерево похоже на это:

SurfaceWindow---Startscreen
..........................--------Страница----------Подстраница

Я пытаюсь назвать метод от "Подстраницы" из "Кода Позади" Startscreen(Startscreen.xaml.cs).

Метод от Подстраницы похож на это:

общественность освобождает showTheme (тема ThemeViewModel) {...}

Если знают, что я могу назвать его, когда я нахожусь на "Странице" или "SurfaceWindow", потому что это находится в том же "ответвлении" дерева, и я просто делаю что-то вроде этого:

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

Но как я делаю это, когда я не нахожусь на том же ответвлении дерева и хочу назвать метод?

1
задан skaffman 26 September 2010 в 21:52
поделиться

2 ответа

Не могли бы вы предоставить более подробную информацию? ваша терминология может означать разные вещи. Если вы имеете в виду, что хотите вызвать метод под названием 'showTheme' в элементе управления с именем 'katalogBlatt' вне родительского элемента управления, вам либо нужно предоставить метод родительского элемента для вызова метода дочерних элементов управления:

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

и вызвать его как :

page.ShowTheme(theme)

или вам нужно предоставить элемент управления как общедоступное свойство для родительского объекта:

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

и называть его так:

page.Catalog.ShowTheme(theme);
1
ответ дан 3 September 2019 в 00:37
поделиться

Я поддержу комментарий J Rothe о том, что ваша терминология сбивает с толку. Однако я также сделаю попытку.

Мне кажется, что вы хотите, чтобы какое-то событие на вашем "StartScreen" вызывало метод на вашей "Subpage". В связи с этим возникает вопрос, что делать, если есть несколько "подстраниц". Предположим, что вы хотите вызвать их все.

Техника, которую я бы рекомендовал, заключается в том, чтобы ваша "подстраница" связывалась с некоторыми глобальными данными, чтобы узнать, какое представление она должна показывать в каждый момент времени. Я вообще предпочитаю привязку к данным, поэтому сначала покажу этот способ.

Самый простой способ сделать это с помощью привязки данных - иметь свойство в вашем объекте Application (или другом статическом объекте), которое является текущей темой. Вместо того чтобы вызывать subpage.ShowTheme(), любой код, изменяющий тему, просто обновляет свойство theme:

MyApp.Current.Theme = theme;

Теперь Subpage может использовать связывание данных для получения темы, привязанной к одному из ее собственных свойств в стиле по умолчанию:

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

В определении для свойства Theme Subpage используйте 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 });

Опять же, если это возможно, я бы использовал технику связывания данных.

1
ответ дан 3 September 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: