2013-03-22 23 views
0

我是WPF,C#和xaml的新手。我會把我的知識描述爲很差,但越來越多。獲取用戶變量,設置其值,並在另一個屏幕上顯示

我有一個非常簡單的應用程序。我試圖完成的是:

我有一個文本框,我要求應用程序的用戶輸入一個電子郵件地址。我想在某處存儲該變量,以後我可以將它寫入屏幕。所以: 1.獲取電子郵件地址(用戶點擊'下一步'按鈕) 2.「謝謝電子郵件將設置爲」「當公用事業完成。」

我在SketchFlow中使用Blend。我創建了一個允許我存儲變量的單例類。

namespace Mysillyapplication 
{ 
public class ApplicationParameters 
{ 
    private static ApplicationParameters _instance; 
    private string _emailAddress; 

    public static ApplicationParameters Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new ApplicationParameters(); 
      } 
      return _instance; 
     } 

    } 

    public string EmailAddress 
    { 
     get { return _emailAddress; } 
     set 
     { 
      _emailAddress = value; 
     } 
    } 
} 

是獲取電子郵件地址頁面的代碼:

namespace Mysillyapplication 
{ 
/// <summary> 
/// Interaction logic for BasicParameters.xaml 
/// </summary> 
public partial class BasicParameters : UserControl 
{ 
    public BasicParameters() 
    { 
     this.InitializeComponent(); 
    } 

    public string EmailAddress 
    { 
     get 
     { 
      return ApplicationParameters.Instance.EmailAddress; 
     } 
     set 
     { 
      ApplicationParameters.Instance.EmailAddress = value; 
     } 
} 
    } 
    } 

在我的XAML中,我有以下行:

<TextBox x:Name="email" HorizontalAlignment="Left" Height="23" Margin="32,65,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="291"/> 

<i:EventTrigger EventName="Click"> 
       <ei:ChangePropertyAction TargetName="MySillyapplication_BasicParameters_Name" PropertyName="EmailAddress" Value="{Binding Text, ElementName=email}" /> 
       <pi:NavigateToScreenAction TargetScreen="DBSyncScreens.BeginSync"/> 
      </i:EventTrigger> 

AND最後,我想在a上展示它諾特爾頁: 在該頁面的CS,我有以下行:

public string EmailAddress 
    { 
     get 
     { 
      return ApplicationParameters.Instance.EmailAddress; 
     } 
     set 
     { 
      ApplicationParameters.Instance.EmailAddress = value; 
     } 
    } 

而在XAML:

<TextBlock HorizontalAlignment="Left" Height="25" Margin="10,35,0,0" Style="{DynamicResource BasicTextBlock-Sketch}" 
       VerticalAlignment="Top" Width="605" > 
     <Run Text="A log of the sync will be sent to "/> 
     <Run Text="{Binding EmailAddress, Mode=TwoWay}"/> 
     <Run Text=". Click Next to begin the sync process."/> 
    </TextBlock> 

是錯誤的,不工作。

我可能會這樣做是錯誤的。任何人都有關於如何輕鬆地使用戶可變電子郵件地址容易處理的任何想法。我覺得我想要完成的任務非常簡單,但我卻遇到了很多困難。

獲取一個變量,存儲它,在其他頁面上訪問它。

+0

爲什麼你不能存儲變量在'Session'變量中? – MethodMan 2013-03-22 15:18:21

+0

你能否解釋一下會話是什麼? – Rawle 2013-03-22 15:21:52

+0

您是否有權訪問此鏈接[獲取許多C#問題的答案和示例,請點擊此處](http://www.google.com) – MethodMan 2013-03-22 15:22:58

回答

0

我寫這在我的博客上張貼位What is this "DataContext" you speak of?

總之,WPF應用程序有兩個層次:用戶界面層和數據層。

數據層爲DataContext,在UI層使用綁定以稍後訪問數據。

當你寫<TextBox Text="{Binding EmailAddress}" />,你告訴WPF看在TextBox背後的數據層(DataContext)並綁定到EmailAddress財產。

DataContext被繼承下來的可視化樹,所以通常你只會看到DataContext設置一次,如

public SomeConstructor() 
{ 
    this.InitializeComponent(); 
    this.DataContext = ApplicationParameters.Instance; 
} 

應當注意的是,你還可以指定其他綁定屬性從某處訪問值除當前DataContext以外,如ElementNameSource

例如,由於要綁定到Singleton屬性,可以使用下面的語法爲您綁定:

Text="{Binding Path=EmailAddress, 
       Source={x:Static my:ApplicationParameters.Instance}}" 

這將設置你的綁定到你的單件對象源,所以它會綁定到ApplicationParameters.Instance.EmailAddress

對於這個工作,你還必須指定「我的」命名空間,就像這樣:

<Window ... xmlns:my="clr-namespace:MyNamespace" /> 

但長話短說,你的綁定不起作用的原因是因爲你的TextBlock後面的DataContext不是ApplicationParameters.Instance,所以它找不到EmailAddress屬性綁定到:)

0

這是因爲您尚未在第二頁上設置DataContext,因此它找不到EmailAddress

在你的頁面構造嘗試添加:

DataContext = this; 
0

BasicParameters構造函數中添加以下代碼:

public BasicParameters() 
{ 
    this.InitializeComponent(); 
    this.DataContext = ApplicationParameters.Instance; 
} 

HTH!

相關問題