2017-04-14 136 views
2

我想在C#中學習屬性(獲取和設置)。我仍然對這門語言很陌生,目前正在製作一個使用WPF和一些文本框的簡單程序,如圖所示。如何將屬性(get; set;)分配給WPF用戶控件?

所以,這裏有介紹:

  • 輸入:這是在那裏用戶可以鍵入輸入,位於主窗口
  • 輸出1:這是在哪裏看到在輸入的輸入字符串,位於主窗口
  • 輸出2:與輸出1相同,位於主窗口中的選項卡1內。
  • 輸出3:與輸出1相同,位於選項卡2內部,仍位於MainWindow。
  • 輸出4:與輸出1相同,位於標籤2內部,稱爲本地UserControl Page1。
  • 按鈕:一個按鈕 「保存」 輸入

下面是代碼: 主窗口:溶液 - >我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> 

之後加入x:Name="Page1"主窗口後面的代碼:溶液 - - >添加一行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); 
    } 
} 

下一步是的Page1.xaml(沒有變化中號ADE這裏的解決方案)

<!-- 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> 

第1頁後面的代碼:解決方案 - >刪除計時器,並添加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; 
     }*/ 
    } 
} 

最後一個,屬性,簡單的版本:

// myProperty.cs 

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

物業與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)); 
      } 
     } 
    } 
} 

下面是程序窗口的截圖: onetwo

正如你所看到的,只有輸出4是空的,其他輸出仍然給我的結果,即使我不使用INotifyPropertyChanged的。我的問題是爲什麼,我該如何解決這個問題?我想知道是不是因爲我正在使用UserControl來處理Output4所在的Page1頁。我一直在尋找答案,但沒有提供任何內容。任何幫助深表感謝。謝謝。

好吧,我更新了代碼。現在正在工作。我從passingvalue獲得參考:How to Pass a Value From a Window to a UserControl in WPF

謝謝。

+0

提供整個XAML,以便它看起來完全像你的形象。沒有人會費心在你的代碼中添加缺失的部分。 –

+0

頁面1的代碼隱藏內部定義的屬性'myprop'是類'myProperty'的新實例,因此它是空的。在MainWindow和Page1中定義的類型爲myProperty的屬性是具有相同名稱的兩個屬性,但是是同一類的不同實例。如果你想「分享」mainwindow和page1之間的屬性,你應該考慮使用數據綁定https://msdn.microsoft.com/en-us/library/ms752347(v=vs.110).aspx。 – CiccioRocca

+0

@NareshRavlani整個代碼已被添加。抱歉。 –

回答

0

你的問題在於你誤以爲MainWindow的myProperty和Page1的myProperty。

在Page1中,您使用myProp.myData設置了output4.Text,這是錯誤的,因爲myProp是Page1的myProp,它永遠不會更新。

如果您將MainWindow對Page1的引用傳遞給它,而是寫入類似output4.Text = myMainWindowReferenc.myProp.myData;的東西,它將按預期工作。

您還可以添加通過設置在XAML命名第1頁中您button_Click功能OUTPUT4:

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

你能告訴我細節嗎?我是新來的這些東西.. –

+0

我明白了。所以我只需要在MainWindow.xaml的'local:Page1'旁邊放置'x:Name =「Page1''。非常感謝你。我會用解決方案更新我的帖子。 –