2017-10-17 14 views
0

J'ai une propriété de dépendance dans un UserControl avec une propriété appelée SelectedColor. De mon application principale, la vue de la fenêtre qui utilise mon code est:Envoyer la valeur du modèle View à la propriété de dépendance UserControl WPF

<controls:ColorPicker SelectedColor="{Binding MyCanvas.CanvasBackgroundColor}" /> 

Et le code du modèle de vue est:

public MyCanvas { get; set; } 

public MyWindowViewModel(MyCanvas myCanvas) 
{ 
    MyCanvas = myCanvas; 
} 

Et puis le XAML pour mon UserControl est:

<UserControl . . .> 
    <Button Click="Button_Click"> 
     <Button.Style> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Border Background="{Binding SelectedColor}" BorderBrush="Black" BorderThickness="1" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Button.Style> 
</Button> 
</UserControl> 

Et le code-behind:

public ColorPicker() 
{ 
    InitializeComponent(); 
    DataContext = this; 
} 

public SolidColorBrush SelectedColor 
{ 
    get { return (SolidColorBrush)GetValue(SelectedColorProperty); } 
    set { SetValue(SelectedColorProperty, value); } 
} 

public static readonly DependencyProperty SelectedColorProperty = 
    DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null)); 

Je pense que le problème pourrait être avec la ligne dans le code derrière DataContext = this;. Est-il correct que déclarer cela crée un contexte entièrement nouveau pour l'instance de ce contrôle utilisateur dans l'application principale et donc toutes les valeurs qui lui sont envoyées à partir du modèle de vue seront ré-initialisées? Si oui, comment puis-je envoyer la valeur sans qu'elle soit re-déclarée? J'ai aussi besoin de la ligne DataContext = this car sans cela, certaines fonctionnalités de mon UserControl ne fonctionneront plus.

Est-ce que quelqu'un a déjà rencontré ça?

Merci d'avance!

+0

'this.DataContext = ceci:' est le cancer WPVM MVF. [Cet article explique pourquoi] (http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html). Vous remarquerez que c'est un peu long, mais la chimiothérapie aussi. – Will

Répondre

0

DataContext = this définit le DataContext du UserControl à lui-même. Tu ne veux pas faire ça. vous pourriez plutôt se lier à une propriété du UserControl en utilisant un {RelativeSource} sans définir la propriété DataContext:

<Border Background="{Binding SelectedColor, RelativeSource={RelativeSource AncestorType=UserControl}}" 
     BorderBrush="Black" BorderThickness="1" /> 

code-behind:

public ColorPicker() 
{ 
    InitializeComponent(); 
} 

public SolidColorBrush SelectedColor 
{ 
    get { return (SolidColorBrush)GetValue(SelectedColorProperty); } 
    set { SetValue(SelectedColorProperty, value); } 
} 

public static readonly DependencyProperty SelectedColorProperty = 
    DependencyProperty.Register(nameof(SelectedColor), typeof(SolidColorBrush), new UIPropertyMetadata(null)); 
+0

Cela fonctionne comme un charme @ mm8! Merci! –

+0

Je préfère utiliser ElementName au lieu d'un RelativeSource ... – Will