2014-07-14 2 views
1

Я работаю над универсальным приложением (Windows 8.1).Связь UserControl со своей родительской страницей в Windows 8.1

Я хотел бы увеличить стоимость недвижимости "Number" на моей основной странице, нажав на кнопку в моем UserControl.

(приведенный выше код является примером)

MainPage.xaml:

<Page 
    x:Class="App3.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App3" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:uc="using:App3" 
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 

    <Grid> 
     <uc:MyUserControl1></uc:MyUserControl1> 
    </Grid> 
</Page> 

MainPage.xaml.cs:

namespace App3 
{ 
    public sealed partial class MainPage : Page 
    { 
     public int number { get; set; } 

     public MainPage() 
     { 
      this.InitializeComponent(); 

      this.NavigationCacheMode = NavigationCacheMode.Required; 
     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
     } 
    } 
} 

MyUserControl1.xaml

<UserControl 
    x:Class="App3.MyUserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:App3" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400"> 

    <Grid> 
     <StackPanel> 
     <TextBlock Text="Test" /> 
     <TextBlock Text="Test" /> 
     <TextBlock Text="Test" /> 
     <Button Height="20" 
       Width="50" 
       Content="click" 
       Click="Button_Click"/> 
      <TextBlock Text="Test" /> 
      <TextBlock Text="Test" /> 
      <TextBlock Text="Test" /> 
     </StackPanel> 
    </Grid> 
</UserControl> 

MyUserControl1.xaml.cs

namespace App3 
{ 
    public sealed partial class MyUserControl1 : UserControl 
    { 
     public MyUserControl1() 
     { 
      this.InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      //TODO : ? 
     } 
    } 
} 

Как я могу сделать? Я не хочу, чтобы использовать свойство в app.cs ...

+0

Почему вы не делаете свойство зависимостей в вашем UserControl и связать эту собственность какого-либо свойства в MainPage.xaml.cs. – loop

ответ

3

Определите свойство Dependency в вашем usercontrol и привяжите это свойство к одному свойству в MainPage.by, используя свойство зависимости, которое ваш usercontrol будет вести себя как независимый элемент управления, как и некоторые элементы управления Button и т. Д. Это даст вам пример использования DependencyProperty ,

В вашем UserControl добавить этот код

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

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     //TODO : ? 
     Caption = 2; 
    } 

    public int Caption 
    { 
     get { return (int)GetValue(CaptionProperty); } 
      set { SetValue(CaptionProperty, value); } 
    } 

    public static readonly DependencyProperty CaptionProperty = 
      DependencyProperty.Register("Caption", typeof(int), typeof(MyUserControl1), 
      new PropertyMetadata(0, null)); 

} 

В MainPage.xaml вы связать этот заголовок свойство, как это.

<Grid> 
    <uc:MyUserControl1 Caption="{Binding SomeValue,Mode=TwoWay}" ></uc:MyUserControl1> 
</Grid> 

Добавить собственность в MainPage.Xaml.cs как это.

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     this.DataContext = this; 
    } 

    public string SomeValue 
    { 
     set 
     { 
      string df = value; // put a break point here and check 
     } 
    } 
} 

Now put a break point on Set and see if is it changing or not.

+0

Так что, если у меня 5 подобных userControl, il нужно написать это? ' <ис: MyUserControl1 Надпись = "{Binding SomeValue, Режим = TwoWay}"/> <ис: MyUserControl2 Надпись = "{Binding SomeValue, Режим = TwoWay}"/> ' – Bleik

+1

Вы можете использовать ListBox этих usercontrols. и установите itemssource этого списка для отображения/Наблюдаемой коллекции someclass. этот объект «someclass» соответствует вашему элементу usercontrol. поэтому «SomeValue» является свойством «someclass», которое будет нажато при нажатии. – loop

3

Создать событие в вашем UserControl так:

namespace App3 
{ 
public sealed partial class MyUserControl1 : UserControl 
{ 
    public event EventHandler ButtonClicked; 

    public MyUserControl1() 
    { 
     this.InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     //TODO : ? 
     if (ButtonClicked != null) 
      ButtonClicked(this, new EventArgs()); 
    } 
} 
} 

затем в вашем XAML для MainPage установить EventHandler для ButtonClicked события в UserControl как так

<uc:MyUserControl1 ButtonClicked="Increment_Click"></uc:MyUserControl1> 

Затем в код для вашего MainPage создать метод Increment_Click:

private void Increment_Click(Object sender, RoutedEventArgs e) 
{ 
    number++; 
} 
+0

Это сработало. это круто. Благодарю. +1 –

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