2010-09-23 8 views
1

J'ai deux boutons, et j'ai besoin de les relier avec une ligne. Je lie les coordonnées de la ligne aux positions des boutons.La liaison ne fonctionne pas ... (WPF) "x: Nom" problème?

J'ai besoin d'ajouter cette liaison par code.

En XAML ce travail très bien comme ceci:

<Button x:Name="button1" Width="10" Height="10" Canvas.Left="150" Canvas.Top="150"/> 
<Button x:Name="button2" Width="10" Height="10" Canvas.Left="250" Canvas.Top="100"/> 

<Line x:Name="testLine" Stroke="Black" 
     X1="{Binding ElementName=button1, Path=(Canvas.Left)}" 
     Y1="{Binding ElementName=button1, Path=(Canvas.Top)}" 
     X2="{Binding ElementName=button2, Path=(Canvas.Left)}" 
     Y2="{Binding ElementName=button2, Path=(Canvas.Top)}"/> 

Maintenant, dans le code, j'ai essayé:

Binding b = new Binding("(Canvas.Left)"); 
    b.ElementName = "button1"; 
    testLine.SetBinding(System.Windows.Shapes.Line.X1Property, "(Canvas.Left)"); 

mais cela ne fonctionne pas ... (

EDIT :

Il existe un problème lors de la création dynamique du estion:

Button button1 = new Button(); 
Canvas.SetLeft(button1, 50); 
Canvas.SetTop(button1, 50); 
button1.Name = "be1"; 
mainCanvas.Children.Add(button1); 

Button button2 = new Button(); 
Canvas.SetLeft(button2, 150); 
Canvas.SetTop(button2, 150); 
button2.Name = "be2"; 
mainCanvas.Children.Add(button2); 

Binding b1 = new Binding() { ElementName = "be1", Path = new PropertyPath("(Canvas.Left)") }; 
Binding b2 = new Binding() { ElementName = "be2", Path = new PropertyPath("(Canvas.Left)") }; 

testLine.SetBinding(System.Windows.Shapes.Line.X1Property, b1); 
testLine.SetBinding(System.Windows.Shapes.Line.X2Property, b2); 

Il semble que « BE1 » n'existe pas ou je ne sais pas quoi ...

button1.RegisterName(button1.Name, button1); //does not help, error... 

Répondre

2

êtes-vous sûr que vous ne vouliez pas dire:

Binding b = new Binding("(Canvas.Left)"); 
    b.ElementName = "button1"; 
    testLine.SetBinding(System.Windows.Shapes.Line.X1Property, b); 

EDIT:

vous ne devriez pas besoin du nom de l'élément du tout:

Button button1 = new Button(); 
Canvas.SetLeft(button1, 50); 
Canvas.SetTop(button1, 50); 
mainCanvas.Children.Add(button1); 

Button button2 = new Button(); 
Canvas.SetLeft(button2, 150); 
Canvas.SetTop(button2, 150); 
mainCanvas.Children.Add(button2); 

//juse Source reference not ElementName 
Binding b1 = new Binding() { Source = button1, Path = new PropertyPath("(Canvas.Left)") }; 
Binding b2 = new Binding() { Source = button2, Path = new PropertyPath("(Canvas.Left)") }; 

testLine.SetBinding(System.Windows.Shapes.Line.X1Property, b1); 
testLine.SetBinding(System.Windows.Shapes.Line.X2Property, b2); 
+0

Je pense que le problème est avec le nom dynamique, voir éditer ... – serhio

+0

ouais ... vraiment cool. Merci!! – serhio

+1

Juste pour résoudre votre problème de "nom dynamique", vous devriez faire mainCanvas.RegisterName ("be1", button1) au lieu d'appeler RegisterName sur le bouton. – ASanch

1

Peut-être qu'il est seulement une frappe d'erreur. Vous créez une liaison mais ne l'utilisez pas. Essayez:

testLine.SetBinding(System.Windows.Shapes.Line.X1Property, b); 
1

Essayez d'utiliser l'autre surcharge de SetBinding ... vous créez une nouvelle liaison dans le code mais vous ne l'utilisez pas réellement.

Binding b = new Binding("(Canvas.Left)"); 
b.ElementName = "button1"; 
testLine.SetBinding(System.Windows.Shapes.Line.X1Property, b); 
Questions connexes