Обновить текстовое поле при изменении переменной - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время, чтобы обновить мои текстовые поля, мне нужно отойти от моего SettingsPage и затем вернуться в него, чтобы увидеть изменения в TextBoxes.

Сможете ли вы помочьс получением этих TextBoxes для обновления при изменении глобальной переменной?Я рассмотрел использование INotifyPropertyChanged.Я просто не уверен, как лучше это реализовать

Вот код, который у меня есть в настоящее время.он очень простой.

Страница настроек XAML

<Frame Background="{StaticResource CustomAcrylicDarkBackground}">
   <StackPanel>
       <TextBox Width="500" Header="File Name" IsReadOnly="True" Foreground="White" Text="{x:Bind TextBoxFileName}"/>
       <TextBox Width="500" Header="File Location" IsReadOnly="True" Foreground="White" Text="{x:Bind TextBoxFilePath}"/>
   </StackPanel>
</Frame>

Код позади

using static BS.Data.GlobalVariableStorage;

namespace BS.Content_Pages
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class SettingsPage : Page
    {
        public SettingsPage()
        {
            this.InitializeComponent();
        }
            public string TextBoxFilePath = GlobalVariables.FilePath;
            public string TextBoxFileName = GlobalVariables.FileName;

        }


    }

}        

Класс GlobalVariablesStorage

namespace BS.Data
{
    class GlobalVariableStorage
    {
        public static class GlobalVariables
        {
            public static string FilePath { get; set; }
            public static string FileName { get; set; }
        }

    }
}

Функция сохранения файла в MainPage.XAML.cs (анализирует имя сохранения в GlobalVariableStorage)

public async void SaveButton_ClickAsync(object sender, RoutedEventArgs e)
   {
       SaveFileClass instance = new SaveFileClass();
       IStorageFile file = await instance.SaveFileAsync();
       if (file != null)
         {
           GlobalVariables.FileName = file.Name;
            GlobalVariables.FilePath = file.Path;

                // Debugging the output file paths
                // Remember to REMOVE
                Debug.WriteLine(GlobalVariables.FileName);
                Debug.WriteLine(GlobalVariables.FilePath);

                WriteFile.WriteFileData();
        }            
   }

1 Ответ

0 голосов
/ 07 сентября 2018

Основная проблема заключается в том, что вам нужно как-то сообщить своему представлению, когда обновлять значения, связанные с данными. И чтобы вы могли это сделать, вам нужно знать, когда это произойдет.

Другими словами, класс GlobalVariables должен вызывать событие всякий раз, когда любому свойству присваивается новое значение. Например, он может вызвать встроенное событие PropertyChanged:

public static class GlobalVariables
{
    private static string _filePath;
    public static string FilePath
    {
        get { return _filePath; }
        set { _filePath = value; NotifyPropertyChanged(); }
    }

    private static string _fileName;
    public static string FileName
    {
        get { return _fileName; }
        set { _fileName = value; NotifyPropertyChanged(); }
    }

    public static event PropertyChangedEventHandler PropertyChanged;
    private static void NotifyPropertyChanged([CallerMemberName]string propertyName = "") =>
        PropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}

По вашему мнению, вы можете подписаться на это событие и вызвать другое событие, которое обрабатывает представление. Вы указываете представлению обновить значение, привязанное к данным, путем реализации интерфейса INotifyPropertyChanged и вызвать событие PropertyChanged для свойства, которое будет обновлено. Примерно так:

public sealed partial class SettingsPage : Page, INotifyPropertyChanged
{
    public SettingsPage()
    {
        this.InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        GlobalVariables.PropertyChanged += GlobalVariables_PropertyChanged;
    }

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        GlobalVariables.PropertyChanged -= GlobalVariables_PropertyChanged;
    }

    private void GlobalVariables_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case nameof(GlobalVariables.FilePath):
                NotifyPropertyChanged(nameof(TextBoxFilePath));
                break;
            case nameof(GlobalVariables.FileName):
                NotifyPropertyChanged(nameof(TextBoxFileName));
                break;
        }
    }

    public string TextBoxFilePath => GlobalVariables.FilePath;
    public string TextBoxFileName => GlobalVariables.FileName;

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName) =>
        PropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}

Также обратите внимание, что режимом по умолчанию x:Bind является OneTime, поэтому вы должны явно установить Mode на OneWay в представлении, например ::

Text="{x:Bind TextBoxFilePath, Mode=OneWay}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...