7

これが可能かどうかはわかりませんが、質問してみようと思いました。まず、私の目的のために、これは XAML 部分ではなく C# 部分で機能する必要があります。これは私が持っているもので、動作します:

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 行を分割の 2 番目の結果に置き換えるだけです。ただし、分割の最初の結果に従って binding.Source 行をどのように置き換えますか。これが可能であれば、"MyClass2Object.StringVar" のような文字列を渡して TextBox の Text プロパティをそのプロパティにバインドするか、"AnotherClassObject.StringProperty" のような文字列を渡して TextBox' ■ テキスト プロパティは、AnotherClassObject という名前の変数でインスタンス化されたオブジェクトの StringProperty プロパティにバインドします。私が理にかなっていることを願っています。

4

1 に答える 1

13

PropertyPath を "Property.Property" にする必要があるように聞こえますが、バインディングを機能させるには、最初のプロパティのソース オブジェクトが必要です。私が認識している 2 つのオプションは、DataContextまたはSourceです。

サンプルコードでは、他の代替手段は次のとおりです。

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 に答える