2017-02-03 2 views
0

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).

Répondre

1

Si je me souviens bien, MUI, lors de l'utilisation de son cadre de navigation, il met en cache les données de la page. Il ne construit pas la vue (et par la suite votre modèle de vue) chaque fois qu'il navigue. Pour cela, MUI a ajouté des événements de navigation auxquels vous pouvez vous connecter pour être averti lorsque vous naviguez dans les vues. Dans ces événements, vous pouvez ensuite mettre à jour vos données. De leur wiki

Faites votre navigation de contenu au courant en mettant en œuvre l'interface iContent disponible dans l'espace de noms FirstFloor.ModernUI.Windows.

Vous pouvez faire en sorte que votre modèle de vue implémente l'interface et lors du chargement, actualisez vos données.