2016-03-01 5 views
0

Je veux le contrôle de modèle qui génère dynamiquement des formes différentes selon un contrôle propriété.La de dépendance ressemble à ceci:interface utilisateur mise à jour dans UWP contrôle modèle lorsque la dépendance propriété change

<Style TargetType="local:ColorShape"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:ColorShape"> 
       <ContentControl x:Name="shapeParent"> 
       </ContentControl> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Il possède une propriété depdency pour la forme: shapeType publique

ShapeType 
{ 
    get { return (ShapeType)GetValue(ShapeTypeProperty); } 
    set { SetValue(ShapeTypeProperty, value); } 
} 

public static readonly DependencyProperty ShapeTypeProperty = 
    DependencyProperty.Register("ShapeType", typeof(ShapeType), typeof(ColorShape), new PropertyMetadata(ShapeType.Circle)); 

I génèrent la forme dans le procédé OnApplyTemplate:

protected override void OnApplyTemplate() 
{ 
    var shapeParent = (ContentControl)this.GetTemplateChild("shapeParent"); 
    var shape = GetShape(ShapeType); 
    shapeParent.Content = shape; 

    base.OnApplyTemplate(); 
} 

Je Databind la propriété, et il fonctionne la première fois que je crée le contrôle:

<Controls:ColorShape Grid.Row="1" Width="200" Height="200" Stroke="Black" ShapeType="{x:Bind ViewModel.Shape, Mode=OneWay}" StrokeThickness="5" Fill="{x:Bind ViewModel.Color, Mode=OneWay}" /> 

Mais si je modifie la propriété liée à la ViewModel, qui génère une notification INotifyPropertyChange mais ne redessine pas le modèle

J'ai essayé d'ajouter un rappel dans la propriété de dépendance du contrôle de modèle, et je peux voir qu'il actualise la propriété de dépendance avec les nouvelles valeurs liées à la propriété (dans ce cas ViewModel.Shape), mais il ne rafraîchit pas l'interface utilisateur (n'appelle plus jamais OnApplyTemplate). J'ai essayé d'appeler manuellement la méthode ApplyTemplate, et l'événement OnApplyTemplate ne se fait jamais virer.

+0

Ignore ce ... cliquez sur Faux ... –

Répondre

1

OnApplyTemplate n'est appelée qu'une seule fois, lorsque le modèle est généré. Il ne sera appelé à nouveau, lorsque vous modifiez le modèle sur le contrôle.

Ce que vous avez besoin est un PropertyChangedCallback sur le DependencyProperty.

public int MyProperty 
{ 
    get { return (int)GetValue(MyPropertyProperty); } 
    set { SetValue(MyPropertyProperty, value); } 
} 

public static readonly DependencyProperty MyPropertyProperty = 
     DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0, OnPropertyChanged); 

private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    // Do what you need here 
} 

(La partie que vous manque est le deuxième paramètre à new PropertyMetadata(...)

+0

Ca y est Le problème était que j'appelais 'OnApplyTemplate' dans le' PropertyChangeCallback'. Je devais appeler directement les méthodes pour mettre à jour la forme, comme 'GetShape', etc. – Nekketsu