我有一个问题。我在UWP应用程序中工作,我不知道如何在mainpage.xaml.cs上使用另一个类(外部类_ViewModel)。 _vienmodel类已经在代码的开头实例化(来自App.xaml.cs类)。
在我做的过程中,我来到了_viewmodel类的构造函数3次:S
因此,当我进入MainPage.xmal.cs类时,变量bras.Com.IsConnectionOk的值为false。但实际上,我的变量处于真实状态。
类主页:
namespace IHM_UWP
{
/// <summary>
/// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
/// </summary>
public sealed partial class MainPage : Page
{
public bool open = false;
public bool close = false;
/*public bool upAct = false;
public bool downAct = false;
public bool leftAct = false;
public bool rightAct = false;*/
private _ViewModel view = new _ViewModel(); // cette classe n'est pas bien implementé
private Brush colorButton = new SolidColorBrush();
public MainPage()
{
this.InitializeComponent();
colorButton = Up.Background;
}
private void KeyDown_detect(object sender, KeyRoutedEventArgs e)
{
// si la connexion est établie alors on peut envoyer les trames pour les touches de direction
if (view.Bras.Com.IsConnectionOk == true)
{
if (e.Key == Windows.System.VirtualKey.Up)
{
// Effet visuel pour indiquer que l'on a cliqué sur la touche UP
Up.Background = new SolidColorBrush(Windows.UI.Colors.Green);
Down.Background = colorButton;
Left.Background = colorButton;
Right.Background = colorButton;
view.Bras.MoveArmUp();
}
if(e.Key == Windows.System.VirtualKey.Down)
{
// Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
Down.Background = new SolidColorBrush(Windows.UI.Colors.Green);
Up.Background = colorButton;
Left.Background = colorButton;
Right.Background = colorButton;
view.Bras.MoveArmDown();
}
if (e.Key == Windows.System.VirtualKey.Right)
{
// Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
Right.Background = new SolidColorBrush(Windows.UI.Colors.Green);
Up.Background = colorButton;
Left.Background = colorButton;
Down.Background = colorButton;
view.Bras.MoveArmRight();
}
if (e.Key == Windows.System.VirtualKey.Left)
{
// Effet visuel pour indiquer que l'on a cliqué sur la touche DOWN
Left.Background = new SolidColorBrush(Windows.UI.Colors.Green);
Up.Background = colorButton;
Down.Background = colorButton;
Right.Background = colorButton;
view.Bras.MoveArmLeft();
}
}
}
}
}
Class _ViewModel.cs:
namespace IHM_UWP
{
public class _ViewModel : INotifyPropertyChanged
{
private GestionBras bras= new GestionBras(); //On peut ajouter cet instance dans la classe App.Xaml.cs?
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] string str = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(str));
}
}
public _ViewModel()
{
}
/// <summary>
/// Commande pour lancer la connexion au bras
/// </summary>
private ICommand connect;
public ICommand Connect
{
get
{
if (this.connect == null)
this.connect = new RelayCommand(() => this.Bras.ConnectAsync());
return this.connect;
}
}
/// <summary>
/// Commande pour ouvrir la pince
/// </summary>
private ICommand ouvrirPince;
public ICommand OuvrirPince
{
get
{
if (this.ouvrirPince == null)
this.ouvrirPince = new RelayCommand(() => this.Bras.OuvrirPince());
return this.ouvrirPince;
}
}
/// <summary>
/// Commande pour fermer la pince
/// </summary>
private ICommand fermerPince;
public ICommand FermerPince
{
get
{
if (this.fermerPince == null)
this.fermerPince = new RelayCommand(() => this.Bras.FermerPince());
return this.fermerPince;
}
}
// Class intermedaire pour la gestion de binding
public GestionBras Bras { get => bras; set => bras = value; }
}
}
EnvCoord.xaml.cs类:
namespace IHM_UWP
{
/// <summary>
/// Une page vide peut être utilisée seule ou constituer une page de destination au sein d'un frame.
/// </summary>
public sealed partial class EnvCoord : Page
{
string xcoord = string.Empty;
string ycoord = string.Empty;
string zcoord = string.Empty;
private _ViewModel view = new _ViewModel();
public EnvCoord()
{
this.InitializeComponent();
}
private void CloseWindow(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(MainPage));
}
private void EnvoyerCoord_Click(object sender, RoutedEventArgs e)
{
xcoord = CoordX.Text;
ycoord = CoordY.Text;
zcoord = CoordZ.Text;
view.Bras.SendCoorGeom(xcoord, ycoord, zcoord);
Frame.Navigate(typeof(MainPage));
}
}
}
App.xaml.cs类:
namespace IHM_UWP
{
/// <summary>
/// Fournit un comportement spécifique à l'application afin de compléter la classe Application par défaut.
/// </summary>
sealed partial class App : Application
{
public IHM_UWP._ViewModel view = new IHM_UWP._ViewModel();
/// <summary>
/// Initialise l'objet d'application de singleton. Il s'agit de la première ligne du code créé
/// à être exécutée. Elle correspond donc à l'équivalent logique de main() ou WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoqué lorsque l'application est lancée normalement par l'utilisateur final. D'autres points d'entrée
/// seront utilisés par exemple au moment du lancement de l'application pour l'ouverture d'un fichier spécifique.
/// </summary>
/// <param name="e">Détails concernant la requête et le processus de lancement.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// Ne répétez pas l'initialisation de l'application lorsque la fenêtre comporte déjà du contenu,
// assurez-vous juste que la fenêtre est active
if (rootFrame == null)
{
// Créez un Frame utilisable comme contexte de navigation et naviguez jusqu'à la première page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: chargez l'état de l'application précédemment suspendue
}
// Placez le frame dans la fenêtre active
Window.Current.Content = rootFrame;
}
if (e.PrelaunchActivated == false)
{
if (rootFrame.Content == null)
{
// Quand la pile de navigation n'est pas restaurée, accédez à la première page,
// puis configurez la nouvelle page en transmettant les informations requises en tant que
// paramètre
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// Vérifiez que la fenêtre actuelle est active
Window.Current.Activate();
}
}
/// <summary>
/// Appelé lorsque la navigation vers une page donnée échoue
/// </summary>
/// <param name="sender">Frame à l'origine de l'échec de navigation.</param>
/// <param name="e">Détails relatifs à l'échec de navigation</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Appelé lorsque l'exécution de l'application est suspendue. L'état de l'application est enregistré
/// sans savoir si l'application pourra se fermer ou reprendre sans endommager
/// le contenu de la mémoire.
/// </summary>
/// <param name="sender">Source de la requête de suspension.</param>
/// <param name="e">Détails de la requête de suspension.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
// Remettre tous les moteurs à leur position initial
for (int i = 0; i < view.Bras.Moteur.Length; i++)
{
view.Bras.InitialPosition(view.Bras.Moteur[i].Num_pin);
}
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: enregistrez l'état de l'application et arrêtez toute activité en arrière-plan
deferral.Complete();
}
}
}
如何从我的App.xaml.cs恢复_ViewModel类(具有所有更新的变量值)?我需要在Envcoord.xaml.cs和mainpage.xaml.cs上使用_viewmodel
预先感谢:)
答案 0 :(得分:0)
您应该使用已经在MainPage
中创建的实例,而不是在EnvCoord
和App.xaml.cs
中创建新实例。您可以使用App.Current
属性访问它:
public sealed partial class EnvCoord : Page
{
string xcoord = string.Empty;
string ycoord = string.Empty;
string zcoord = string.Empty;
private readonly _ViewModel view;
public EnvCoord()
{
this.InitializeComponent();
view = (App.Current as App).view;
DataContext = view;
}
private void CloseWindow(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(MainPage));
}
private void EnvoyerCoord_Click(object sender, RoutedEventArgs e)
{
xcoord = CoordX.Text;
ycoord = CoordY.Text;
zcoord = CoordZ.Text;
view.Bras.SendCoorGeom(xcoord, ycoord, zcoord);
Frame.Navigate(typeof(MainPage));
}
}