获取一个用户变量,设置它的值,并在另一个屏幕上显示它

本文关键字:另一个 显示 屏幕 设置 一个 变量 用户 获取 | 更新日期: 2023-09-27 18:05:24

我是WPF、c#和xaml的新手。我认为我的知识很贫乏,但在不断增长。

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

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

我使用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>

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

是错误的,不能工作。

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

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

获取一个用户变量,设置它的值,并在另一个屏幕上显示它

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

总的来说,WPF应用程序有两层:UI层和数据层。

数据层为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

要使其工作,还必须指定"my"命名空间,如下所示:

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

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

这是因为你没有设置你的DataContext在你的第二页,所以它不能找到EmailAddress

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

DataContext = this;

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

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

HTH !

相关文章: