Получение пользовательской переменной, установка ее значения и отображение на другом экране
Я новичок в 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>
неправильно и не работает.
Я мог бы сделать это неправильно. У любого есть идеи о том, как легко сделать этот переменный адрес электронной почты простым в обращении. Я чувствую, что то, что я пытаюсь сделать, очень легко, но у меня так много трудностей с этим.
получить переменную, сохранить ее, получить доступ к ней на других страницах.
3 ответа
Я немного написал об этом в своем блоге. Что это за "DataContext", о котором вы говорите?
Подводя итог, можно сказать, что приложения WPF имеют два уровня: уровень пользовательского интерфейса и уровень данных.
Уровень данных является DataContext
и привязки используются на уровне пользовательского интерфейса для последующего доступа к данным из данных.
Когда ты пишешь <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
так что не находит EmailAddress
свойство связывать с:)
Это потому, что вы не установили свой DataContext
на вашей второй странице, поэтому он не может найти EmailAddress
,
В конструкторе вашей страницы попробуйте добавить:
DataContext = this;
В BasicParameters
конструктор, добавьте следующий код:
public BasicParameters()
{
this.InitializeComponent();
this.DataContext = ApplicationParameters.Instance;
}
НТН!