Question à la finNavigation entre les pages avec le modèle d'actualisation
Information: J'utilise l'interface utilisateur moderne mais je pense que ce problème pourrait ne pas être lié uniquement à ce cadre, d'où je l'ai posté sous « WPF » et ' liaison de données ».
Qu'est-ce que je cherche à accomplir:
Je DataGrid avec quelques données simples dans ce (appelons ces données produits). Je veux créer une fonctionnalité suivante. Après un double clic sur la ligne, l'utilisateur est redirigé vers une page "édition de produit" (appelons cette page ProductPage.xaml) où il y aura plus d'informations sur le produit. Avant de montrer toutes les données à l'application de l'utilisateur est supposé appeler SQL Server et demander toutes les informations sur le produit sélectionné. Plus tard, l'utilisateur peut voir toutes les informations sur le produit où il peut le modifier. L'utilisateur accepte les éditions en cliquant sur le bouton, si le bouton n'a pas été cliqué mais s'il passe à une autre page sans cliquer sur ce bouton, les modifications ne doivent pas être prises en compte.
Problème
Après une redirection vers ProductPage.xaml avec des informations de base sur le produit caché dans Application.Current.Properties
cette page ne sont pas en cours d'actualisation. Le constructeur n'est pas appelé (comme je suppose que c'est un comportement attendu) donc j'ai créé une méthode qui est appelée après que la page soit chargée mais même si le modèle est actualisé, la page ne l'est pas. Toutes les liaisons fonctionnent correctement pendant première page chargement de la page (lorsque le constructeur est appelé) mais quand je retourne à datagrid et que je choisis un autre ancien modèle de ligne est présent.
Code Comment effectuer une redirection? Tout d'abord ce que je faisais était:
public void MouseDoubleClickMethod()
{
/// getting id by row Id = ...
var url = $"ProductPage.xaml?id={id}"
BBCodeBlock bs = new BBCodeBlock();
Application.Current.Properties["product_id"] = Id;
bs.LinkNavigator.Navigate(new Uri(url, UriKind.Relative), this);
///some code
}
Mon modèle simplifié
public class Product : INotifyPropertyChanged{
private decimal _price;
public decimal Price
{
get { return _price; }
set
{
_price = value;
OnPropertyChanged(nameof(Price));
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Ma fixation simplifiée (Le produit est une propriété publique)
<StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType=Page}}">
<StackPanel DataContext="{Binding Path=Product}">
<TextBox x:Name="Price" Text="{Binding Path=Price, Mode=TwoWay}" />
Mon après-charge méthode simplifié
productId = (int)Application.Current.Properties["product_id"];
Product.UpdateFrom(Database.GetGetProduct(id)); // this method updates all fields in model
Commentaires
modèle ne change mais il est pas rafraîchissante zone de texte. Textbox conserve les mêmes données sans être lié à une propriété. J'utilise ?id={id}
pour m'assurer que l'autre ligne est en cours de chargement, sans cela elle continue à montrer les données de la première ligne du double-clic.
Je soupçonne que mes fixations sont défectueuses.
Question
Que puis-je faire avec cette liaison? Je veux que ma zone de texte soit actualisée après le chargement de la page, non seulement lors de la construction de l'objet. Si vous n'avez aucune idée de ce qu'il faut faire avec, il suffit de poster quelques suggestions sur la façon de le déboguer.
Ceci est réparable en utilisant GUID comme paramètre dans url mais je ne veux pas faire cela. Pourquoi? Il force à exécuter le constructeur de la page (donc à reconstruire xaml).