0

我是 WPF、C# 和 xaml 的新手。我会形容我的知识很贫乏,但正在增长。

我有一个非常简单的应用程序。我想要完成的是以下内容:

我有一个文本框,我要求应用程序的用户输入一个电子邮件地址。我想将该变量存储在某处,以便稍后将其写入屏幕。所以: 1. 获取电子邮件地址(用户点击“下一步”按钮) 2.“感谢电子邮件将设置为”“当实用程序完成时。”

我正在将 Blend 与 SketchFlow 一起使用。我创建了一个允许我存储变量的单例类。

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>

最后,我想在另一个页面上显示它:在该页面的 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>

是错误的并且不起作用。

我可能做错了。任何人都对如何轻松地使该用户变量电子邮件地址易于处理有任何想法。我觉得我想要完成的事情很容易,但我却遇到了很多困难。

获取一个变量,存储它,在其他页面上访问它。

4

3 回答 3

0

那是因为你没有设置你DataContext的第二页所以找不到EmailAddress

在您的页面构造函数中尝试添加:

DataContext = this;
于 2013-03-22T15:58:51.783 回答
0

BasicParameters构造函数中,添加以下代码:

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

于 2013-03-22T16:03:33.127 回答
0

我在我的博客文章中写了一点关于这个你所说的“DataContext”是什么?

总而言之,WPF 应用程序有两层:UI 层和数据层。

数据层是DataContext,UI 层中使用绑定,以便稍后从数据中访问数据。

当您编写 时<TextBox Text="{Binding EmailAddress}" />,您是在告诉 WPF 查看DataContext后面的数据层 ()TextBox并绑定到该EmailAddress属性。

是沿视觉树继承的DataContext,因此通常您只会看到DataContext一次集合,例如

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

应该注意的是,您还可以指定其他绑定属性以从当前位置以外的位置访问值DataContext,例如ElementNameor Source

例如,由于您要绑定到一个Singleton属性,您可以使用以下语法进行绑定:

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

这会将绑定的源设置为单例对象,因此它将绑定到ApplicationParameters.Instance.EmailAddress

为此,您还必须指定“我的”命名空间,如下所示:

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

但长话短说,你的绑定不起作用的原因是因为DataContext你的后面TextBlock不是ApplicationParameters.Instance,所以它找不到EmailAddress要绑定的属性:)

于 2013-03-22T16:15:28.690 回答