Nick
Nick

Reputation: 2265

Binding source is string with path to property

I am unsure if this is even possible, but I thought I would ask. First off, for my purposes, I require this to work in the C# portion and not the XAML part. This is what I have and it works:

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";
     }
}

And this will bind to my StringVar property exactly how I would like it to. However, my question comes with what if I have the literal string "MyClass2Object.StringVar" when setting the binding source. I realize I can use the split function to separate "MyClass2Object" and "StringVar" from the longer string. I can then just replace the new PropertyPath line with the the second result from the split. However, how would I replace the binding.Source line according to the first result from the split. If this is possible, I would be able to pass a string like "MyClass2Object.StringVar" and have the TextBox's Text property bind to that property or if I pass a string like "AnotherClassObject.StringProperty" and have the TextBox's Text property bind to the StringProperty property of the object instantiated in the variable with name AnotherClassObject. I hope I am making sense.

Upvotes: 7

Views: 30455

Answers (1)

Todd White
Todd White

Reputation: 7880

It sounds like you want the PropertyPath to be "Property.Property" which will work, but for the binding to work it needs a source object for the first Property. The two options that I'm aware of are DataContext or a Source.

With your sample code the other alternative is:

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";
    }
}

Upvotes: 13

Related Questions