我是WPF,C#和xaml的新手。我把我的知识描述为穷人,但却在成长。
我有一个非常简单的应用程序。我想要完成的是以下内容:
我有一个文本框,我要求应用程序的用户输入一个电子邮件地址。我想将该变量存储在某个地方,以后我可以将其写入屏幕。所以: 1.获取电子邮件地址(用户点击“下一步”按钮) 2.“感谢电子邮件将在实用程序完成后设置为”“。
我正在使用Blend with 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>
错了,不起作用。
我可能会以错误的方式做这件事。任何人都有任何关于如何轻松使用户变量电子邮件地址易于处理的想法。我觉得我想要完成的事情非常简单,但我遇到了很多困难。
获取变量,存储它,在其他页面上访问它。
答案 0 :(得分:0)
这是因为您没有在第二页上设置DataContext
,因此无法找到EmailAddress
。
在页面构造函数中尝试添加:
DataContext = this;
答案 1 :(得分:0)
在BasicParameters
构造函数中,添加以下代码:
public BasicParameters()
{
this.InitializeComponent();
this.DataContext = ApplicationParameters.Instance;
}
HTH!
答案 2 :(得分:0)
我在博文What is this "DataContext" you speak of?
中写了一些关于此的内容总而言之,WPF应用程序有两层:UI层和数据层。
数据层是DataContext
,在UI层中使用绑定来稍后从数据中访问数据。
当您编写<TextBox Text="{Binding EmailAddress}" />
时,您告诉WPF查看DataContext
后面的数据层(TextBox
)并绑定到EmailAddress
属性。
DataContext
在可视树下继承,因此通常您只能看到DataContext
一次,例如
public SomeConstructor()
{
this.InitializeComponent();
this.DataContext = ApplicationParameters.Instance;
}
应该注意的是,您还可以指定其他绑定属性来访问当前DataContext
以外的某个值,例如ElementName
或Source
。
例如,由于您绑定到Singleton
属性,因此可以使用以下语法进行绑定:
Text="{Binding Path=EmailAddress,
Source={x:Static my:ApplicationParameters.Instance}}"
这将设置绑定到单个对象的源,因此它将绑定到ApplicationParameters.Instance.EmailAddress
为此,您还必须指定“my”命名空间,如下所示:
<Window ... xmlns:my="clr-namespace:MyNamespace" />
但是长话短说,你的绑定不起作用的原因是因为DataContext
后面的TextBlock
不是ApplicationParameters.Instance
,所以它找不到{{1}要绑定到的属性:)