2010-06-14 7 views
3

J'ai une application WinForms avec des éléments qui sont des contrôles utilisateur WPF hébergés (en utilisant ElementHost). Je veux être capable de lier la propriété de contrôle de mon WinForm (Button.Enabled) à un DependencyProperty personnalisé du contrôle utilisateur WPF hébergé (SearchResults.IsAccountSelected).Liaison à un DependencyProperty de contrôle hébergé WPF dans WinForms

Est-il possible de lier un System.Windows.Forms.Binding à une propriété gérée par DependencyProperty?

En outre, puisque je connais les événements System.Windows.Forms.Binding pour INotifyPropertyChanged.PropertyChanged - une propriété soutenue par DependencyProperty lancera-t-elle automatiquement ces événements ou devrai-je implémenter et gérer manuellement l'envoi des événements PropertyChanged?

+0

On dirait que si vous pouviez, ce serait un hack sévère. Peut-être pas la meilleure route à prendre. – jsmith

+1

@jsmith - L'utilisation d'une liaison n'est peut-être pas la meilleure solution. Quels autres problèmes percevez-vous? L'interface utilisateur croisée est-elle une considération? – Reddog

Répondre

1

DependencyObject n'implémente pas INotifyPropertyChanged, donc si vous suivez cette route, vous devrez implémenter manuellement l'envoi des événements PropertyChanged.

Heureusement DependencyObject a le méthode OnPropertyChanged, donc la mise en œuvre INotifyPropertyChanged dans votre DependencyObject classe dérivée de est trivial, par exemple:

public class MyClass : HeaderedContentControl, INotifyPropertyChanged 
{ 
    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
    var handler = PropertyChanged; 
    if(handler!=null) handler(this, new PropertyChangedEventArgs(e.Property.Name)); 
    base.OnPropertyChanged(e); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

J'aimerais faire écho à la pensée de jsmith que la liaison directement à une propriété UserControl peut ne pas être la meilleure route à prendre. Dans la plupart des cas, MVVM est une meilleure solution. Il y a des exceptions, bien sur.