2015-01-24 3 views
0

Im пытается внести изменения в мою MainPage из Usercontroll. Если мы возьмем следующий сценарий:Связь между MainPage и UserControl

MainPage содержит UC и TextBlock:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">   

    <local:uc></local:uc> 
    <TextBlock Text="Hide me from the UC!" /> 

</Grid> 

UserControll cotains только кнопка:

<Button Content="Button" Click="Button_Click" /> 

Вот CodeBehind для UserControll

public sealed partial class uc : UserControl 
    { 
     public uc() 
     { 
      this.InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      //Do stuff to element in MainPage 
     } 
    } 

Так что мой вопрос, если его возможно для меня, чтобы ухватить из TextBlock Thats, расположенных в MainPage от моего Usercontroll?

Спасибо!

ответ

1

Ну, если элемент на странице, с которым вы хотите манипулировать из UserControl, всегда будет TextBlock, вы можете передать ссылку на него в UserControl. Для этого необходимо создать свойство зависимостей типа TextBlock внутри UserControl и сохранить ссылку в закрытом поле, так что вы можете получить доступ к нему внутри обработчика событий данной кнопки:

private TextBlock _myText; 

public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register(
    "MyText", typeof (TextBlock), typeof (uc), new PropertyMetadata(default(TextBlock), PropertyChangedCallback)); 

public TextBlock MyText 
{ 
    get { return (TextBlock) GetValue(MyTextProperty); } 
    set { SetValue(MyTextProperty, value); } 
} 

private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
{ 
    var self = dependencyObject as uc; 
    var element = args.NewValue as TextBlock; 
    if (self != null && element != null) 
     self._myText = element; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    if (_myText != null) 
     _myText.Visibility = Visibility.Collapsed; 
} 

В этом случае, вы» d связать TextBlock с UserControl, как:

<TextBlock x:Name="SomeTextBlock"/> 
<local:uc MyText="{Binding ElementName=SomeTextBlock}"/> 

конечно, вы можете также использовать свойство зависимостей типа UIElement быть более гибкими.

В качестве альтернативы, определить событие внутри UserControl, который срабатывает при щелчке на кнопку, и пусть сама страница решить, что делать в этом случае (например, скрыть некоторые TextBlock):

public partial class uc : UserControl 
{ 
    public event EventHandler OnButtonClicked; 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (OnButtonClicked != null) 
      OnButtonClicked(this, new EventArgs()); 
    } 
} 

public partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     uc.OnButtonClicked += (sender, args) => 
     { 
      SomeTextBlock.Visibility = Visibility.Collapsed;; 
     }; 
    } 
} 
+0

Очень хороший и толковый ответ! Будучи новичком в этом виде кода, второй вариант для меня более понятен. Единственное, что меня немного задевает, это то, что я должен создать новый экземпляр uc на главной странице. Я пытаюсь работать с mvvm, чтобы избежать этого. Можно ли использовать аналогичный код в подходе MVVM? Но вы очень хорошо ответили на мой вопрос, поэтому я буду принимать это как ответ. – user2915962

+1

Поскольку целью 'uc' является отображение кнопки и отображение/скрытие текстового элемента (который явно принадлежит логике View), я не вижу, как создание экземпляра' uc' внутри страницы (который принадлежит слой «Вид») будет противоречить MVVM. – andreask

Смежные вопросы