Основная проблема заключается в том, что вам нужно как-то сообщить своему представлению, когда обновлять значения, связанные с данными. И чтобы вы могли это сделать, вам нужно знать, когда это произойдет.
Другими словами, класс 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}"