2013-03-22 45 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!

相关问题