7

我不确定这是否可能,但我想我会问。首先,出于我的目的,我要求它在 C# 部分而不是 XAML 部分中工作。这就是我所拥有的并且它有效:

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

这将完全按照我的意愿绑定到我的 StringVar 属性。但是,我的问题是如果在设置绑定源时有文字字符串“MyClass2Object.StringVar”怎么办。我意识到我可以使用 split 函数将“MyClass2Object”和“StringVar”与较长的字符串分开。然后我可以用拆分的第二个结果替换新的 PropertyPath 行。但是,我将如何根据拆分的第一个结果替换 binding.Source 行。如果这是可能的,我将能够传递像“MyClass2Object.StringVar”这样的字符串并将TextBox的Text属性绑定到该属性,或者如果我传递像“AnotherClassObject.StringProperty”这样的字符串并拥有TextBox' ■ Text 属性绑定到在名为AnotherClassObject 的变量中实例化的对象的StringProperty 属性。我希望我说得通。

4

1 回答 1

13

听起来您希望 PropertyPath 为“Property.Property”,这将起作用,但要使绑定起作用,它需要第一个属性的源对象。我知道的两个选项是DataContextSource

使用您的示例代码,另一种选择是:

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";
    }
}
于 2008-11-06T04:27:04.800 回答