Получение пользовательской переменной, установка ее значения и отображение на другом экране

Я новичок в 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;
}

НТН!

Другие вопросы по тегам