2010-09-21 4 views
0

J'ai un objet (classe): Foo.Lier à un objet

Il a la propriété: Bar.

Que dois-je faire pour pouvoir lier cette propriété 'Bar'?

(WPF, .NET 4)

EDIT:

être plus explicite, je donne un exemple:

J'ai un Dot:UserControl

je créer 2 propriétés Dot - CenterX et CenterY:

public double CenterX 
    { 
     get 
     { 
      return Canvas.GetLeft(this) + this.Width/2; 
     } 
     set 
     { 
      Canvas.SetLeft(this, value - this.Width/2); 
     } 
    } 

    public double CenterY 
    { 
     get 
     { 
      return Canvas.GetTop(this) + this.Height/2; 
     } 
     set 
     { 
      Canvas.SetLeft(this, value - this.Height/2); 
     } 
    } 

maintenant:

<Line Stroke="Black" x:Name="line1" 
     X1="{Binding ElementName=dot1, Path=CenterX}" 
     Y1="{Binding ElementName=dot1, Path=CenterY}" 

     X2="{Binding ElementName=dot2, Path=CenterX}" 
     Y2="{Binding ElementName=dot2, Path=CenterY}" /> 

ne fonctionne pas ...

+2

WPF? Winforms? Autre? –

+1

.NET 4 WPF ou ASP.NET ou WinForms? D'où venez-vous? Est-ce que 'Foo' est une instance, ou la classe, et comment l'endroit à partir duquel vous liez peut-il être' Foo'? –

+0

Désolé, j'ai oublié, c'est pour WPF – serhio

Répondre

0

Votre question est pas assez précis pour répondre complètement ... Sauf indication contraire, les chemins de liaison sont toujours par rapport à DataContext du contrôle. En supposant que votre DataContext est une instance de Foo, vous pouvez le faire:

<TextBlock Text="{Binding Bar}" /> 

Ou si vous voulez être plus explicite:

<TextBlock Text="{Binding Path=Bar}" /> 

Maintenant, si Foo lui-même est une propriété de la DataContext actuelle, vous pouvez le faire:

<TextBlock Text="{Binding Foo.Bar}" /> 

Jetez un oeil à ce Binding Cheat Sheet, il est très utile lorsque vous êtes nouveau WPF b inding

+0

J'ai ajouté quelques explications. J'ai «peur» que Vitali ait raison ... – serhio

+0

Étant donné l'exemple ci-dessus, la propriété de dépendance générée me génère le code: 'return (double) GetValue (CenterXProperty);', mais j'ai besoin de 'return Canvas.GetLeft (this) + this.Width/2; '... – serhio

1

Implémentez INotifyPropertyChanged dans votre classe afin que l'infrastructure de liaison WPF sache mettre à jour les contrôles liés pertinents lorsque la propriété a été modifiée.

Pour la liaison réelle, vous pourriez trouver ce utile

http://japikse.blogspot.com/2009/07/inotifypropertychanged-and-wpf.html

Avec INotifyPropertyChanged vous classe ressemblera

public class Foo:INotifyPropertyChanged 
    { 
     public double CenterX 
     { 
      get 
      { 
       return Canvas.GetLeft(this) + this.Width/2; 
      } 
      set 
      { 
       Canvas.SetLeft(this, value - this.Width/2); 
       OnPropertyChanged("CenterX"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

     private void OnPropertyChanged(string propertyName) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Chaque fois que la valeur CenterX est modifiée, la OnPropertyChanged ("CenterX") ; demandera à l'interface utilisateur d'actualiser les contrôles dont les propriétés sont liées

+0

Donc, enfin, quelle est la différence entre un 'DependancyProperty' et' INotifyPropertyChanged' ..? – serhio

+2

@serhio, voir [cette question] (http://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel) –

Questions connexes