2008-11-06 9 views
6

No estoy seguro si esto es posible, pero pensé que podría preguntar. En primer lugar, para mis propósitos, requiero que esto funcione en la parte C# y no en la parte XAML. Esto es lo que tengo y funciona:Fuente de encuadernación es cadena con ruta a la propiedad

public partial class MyClass1 : Window 
{ 
    public MyClass2 MyClass2Object { get; set; } 

    public MyClass1() 
    { 
      InitializeComponent(); 
      MyClass2Object = new MyClass2(); 
      Binding binding = new Binding(); 
      binding.Source = MyClass2Object; 
      binding.Path = new PropertyPath("StringVar"); 
      TextBoxFromXaml.SetBinding(TextBox.TextProperty, binding); 
    } 
} 
public class MyClass2 
{ 
    public string StringVar { get; set; } 

    public MyClass2() 
    { 
      StringVar = "My String Here"; 
    } 
} 

Y esto se unirá a mi propiedad StringVar exactamente como me gustaría. Sin embargo, mi pregunta viene con qué si tengo la cadena literal "MyClass2Object.StringVar" cuando establezco el origen de enlace. Me doy cuenta de que puedo usar la función de división para separar "MyClass2Object" y "StringVar" de la cadena más larga. Entonces puedo simplemente reemplazar la nueva línea PropertyPath con el segundo resultado de la división. Sin embargo, ¿cómo reemplazaría el enlace? Línea de fuente de acuerdo con el primer resultado de la división. Si esto es posible, podría pasar una cadena como "MyClass2Object.StringVar" y hacer que la propiedad TextBox's Text se vincule a esa propiedad o si paso una cadena como "AnotherClassObject.StringProperty" y hacer que la propiedad TextBox's Text se una a la Propiedad StringProperty del objeto instanciado en la variable con el nombre AnotherClassObject. Espero que tenga sentido.

+0

Parte del código 'falso' de lo que le gustaría hacer podría ser un poco más claro que lo que se está describiendo. –

Respuesta

12

Parece que desea que PropertyPath sea "Property.Property", que funcionará, pero para que el enlace funcione, necesita un objeto de origen para la primera propiedad. Las dos opciones que conozco son DataContext o Source.

Con su código de muestra de la otra alternativa es:

public partial class Window1 : Window 
{ 
    public MyClass2 MyClass2Object { get; set; } 
    public Window1() 
    { 
     // use data context instead of source 
     DataContext = this; 

     InitializeComponent(); 

     MyClass2Object = new MyClass2(); 
     Binding binding = new Binding(); 
     binding.Path = new PropertyPath("MyClass2Object.StringVar"); 
     TextBoxFromXaml.SetBinding(TextBox.TextProperty, binding); 
    } 
} 

public class MyClass2 
{ 
    public string StringVar { get; set; } 
    public MyClass2() 
    { 
     StringVar = "My String Here"; 
    } 
} 
+0

Oh gracias, eso funcionó. Podría haber jurado que lo intenté. Muchas gracias. – Nick

Cuestiones relacionadas