2017-04-14 2 views
2

J'essaie d'apprendre la propriété (obtenir et définir) en C#. Je suis encore novice dans la langue et je fais actuellement un programme simple en utilisant WPF avec des zones de texte, comme vous pouvez le voir sur les photos.Comment affecter une propriété (get; set;) à un contrôle utilisateur WPF?

Alors, voici la description:

  • entrée: il est où l'utilisateur peut saisir l'entrée, situé à
  • MainWindow
  • sortie 1: il est là pour voir la chaîne saisie en entrée, situé à MainWindow
  • Sortie 2: identique à la sortie 1, située à l'intérieur de l'onglet 1, à MainWindow.
  • Sortie 3: identique à la sortie 1, située à l'intérieur de l'onglet deux, toujours à MainWindow.
  • Sortie 4: identique à la sortie 1, située à l'intérieur de l'onglet deux, en référence à UserControl local1.
  • Button: un bouton pour "sauver" l'entrée

Voici les codes: fenêtre principale: Solution -> I ajouté x:Name="Page1" après local:page1

<!-- MainWindow.xaml --> 
<Window x:Class="TestGetSet.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:TestGetSet" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="212" Margin="37,20,0,0" VerticalAlignment="Top" Width="447"> 
     <TabItem Header="TabItem"> 
      <Grid Background="#FFE5E5E5"> 
       <TextBox x:Name="output2" HorizontalAlignment="Left" Height="23" Margin="156,76,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/> 
       <Label x:Name="label2" Content="Output 2" HorizontalAlignment="Left" Margin="156,46,0,0" VerticalAlignment="Top"/> 
      </Grid> 
     </TabItem> 

     <TabItem Header="TabItem"> 
      <Grid Background="#FFE5E5E5"> 
       <TextBox x:Name="output3" HorizontalAlignment="Left" Height="23" Margin="321,26,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/> 
       <local:Page1 x:Name="Page1"/> 
       <Label x:Name="label3" Content="Output 3" HorizontalAlignment="Left" Margin="321,0,0,0" VerticalAlignment="Top"/> 
      </Grid> 
     </TabItem> 
    </TabControl> 

    <TextBox x:Name="input" Text=""/> 
    <TextBox x:Name="output1" Text=""/>   
    <Button x:Name="button" Content="Button" Click="button_Click"/> 
    <Label x:Name="label" Content="Input" HorizontalAlignment="Left" Margin="37,239,0,0" VerticalAlignment="Top"/> 
    <Label x:Name="label1" Content="Output 1" HorizontalAlignment="Left" Margin="364,239,0,0" VerticalAlignment="Top"/> 

</Grid> 

code MainWindow derrière: solution - -> ajouté une ligne Page1.passingvalue(..)

// MainWindow.xaml.cs 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 

public partial class MainWindow : Window 
{ 
    public myProperty myProp = new myProperty(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    {  
     myProp.myData = input.Text; 
     output1.Text = myProp.myData; 
     output2.Text = myProp.myData; 
     output3.Text = myProp.myData; 

     Page1.passingvalue(myProp.myData); 
    } 
} 

suivant est Page1.xaml (Aucun changement m ade ici pour la solution)

<!-- Page1.xaml--> 
<UserControl x:Class="TestGetSet.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:TestGetSet" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBox x:Name="output4" Text=""/> 
     <Label x:Name="label" Content="Output 4" HorizontalAlignment="Left" Margin="92,110,0,0" VerticalAlignment="Top"/> 
    </Grid> 
</UserControl> 

Code Page1 derrière: solution -> supprimé minuterie et ajouté passingvalue

// Page1.xaml.cs  
using System; 
using System.Windows.Controls; 
using System.Windows.Threading; 
using System.Threading; 
using System.ComponentModel; 

namespace TestGetSet 
{ 
    public partial class Page1 : UserControl 
    { 
     private Thread _receiveThread; 
     myProperty myProp = new myProperty(); 

     public Page1() 
     { 
      InitializeComponent(); 

      /*DispatcherTimer MyTimer = new DispatcherTimer(); 
      MyTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); 
      MyTimer.Tick += MyTimer_Tick; 
      MyTimer.Start();*/ 
     } 

     public void passingvalue(string m) 
     { 
      output4.Text = m; 
     } 

     /*private void MyTimer_Tick(object sender, EventArgs e) 
     { 
      output4.Text = myProp.myData; 
     }*/ 
    } 
} 

une dernière, la propriété, la version simple:

// myProperty.cs 

namespace TestGetSet 
{ 
    public class myProperty 
    { 
     public string myData { get; set }   
    } 
} 

Immobilier avec INotifyPropertyChanged:

// myProperty.cs 
using System.ComponentModel; 
namespace TestGetSet 
{ 
    public class myProperty : INotifyPropertyChanged 
    { 
     private string _textdata; 

     public string myData { 
      get 
      { 
       return _textdata; 
      } 
      set 
      { 
       _textdata = value; 
       NotifyPropertyChanged("myData"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

Voici les captures d'écran de la fenêtre du programme: one et two

Comme vous pouvez le voir, seul OUTPUT4 est vide et les autres sorties me donnent des résultats encore, même si je ne l'utilise INotifyPropertyChanged. Ma question est pourquoi, et comment puis-je résoudre ce problème? Je me demande si c'est parce que j'utilise UserControl pour Page1, dans lequel se trouve le Output4. J'ai cherché la réponse mais je n'ai rien trouvé. Toute aide est très appréciée. Je vous remercie.

Ok, donc j'ai mis à jour le code. Ça marche maintenant. J'ai eu la référence pour passingvalue de: How to Pass a Value From a Window to a UserControl in WPF

Merci.

+0

Fournir XAML entier pour qu'il ressemble exactement à votre image. Personne ne prendra la peine d'ajouter des pièces manquantes dans votre code. –

+0

La propriété 'myprop' définie à l'intérieur du code-behind de la page1 est une nouvelle instance de la classe 'myProperty' et est donc vide. Les propriétés de type myProperty définies dans MainWindow et dans Page1 sont deux propriétés avec le même nom mais sont des instances différentes de la même classe. Si vous souhaitez "partager" la propriété entre mainwindow et page1, vous devez envisager l'utilisation de Data Binding https://msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx. – CiccioRocca

+0

@NareshRavlani code entier a été ajouté. Pardon. –

Répondre

0

Votre problème ici est que vous induisez en erreur myProperty de MainWindow et myProperty de Page1.

En Page1, vous définissez le output4.Text en utilisant myProp.myData ce qui est faux car myProp est le myProp de la Page1 qui n'est jamais mis à jour.

Si vous passez la référence de MainWindow à Page1 et que vous écrivez quelque chose comme output4.Text = myMainWindowReferenc.myProp.myData; cela fonctionnera comme prévu.

Vous pouvez également ajouter la mise à OUTPUT4 dans votre fonction Button_Click en nommant le Page1 dans le XAML:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    myProp.myData = input.Text; 
    output1.Text = myProp.myData; 
    output2.Text = myProp.myData; 
    output3.Text = myProp.myData; 
    Page1.output4.Text = myProp.myData; 
} 
+0

Pourriez-vous s'il vous plaît me dire les détails? Je suis nouveau à ces choses .. –

+0

Je comprends maintenant. Donc j'ai juste besoin de mettre 'x: Name =" Page1 "' à côté de 'local: Page1' dans MainWindow.xaml. Merci beaucoup. Je mettrai à jour mon message avec la solution. –