Источник привязки - строка с путем к свойству - PullRequest
7 голосов
/ 06 ноября 2008

Я не уверен, что это вообще возможно, но я подумал, что спросить. Прежде всего, для моих целей я требую, чтобы это работало в части 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» и привязать свойство Text TextBox к этому свойству, или если передать строку типа «AnotherClassObject.StringProperty» и привязать свойство Text TextBox к Свойство StringProperty объекта, созданного в переменной с именем AnotherClassObject. Я надеюсь, что это имеет смысл.

1 Ответ

13 голосов
/ 06 ноября 2008

Похоже, вы хотите, чтобы PropertyPath был «Property.Property», который будет работать, но для работы привязки ему нужен исходный объект для первого свойства. Мне известны два варианта: DataContext или Источник .

С вашим примером кода другой вариант:

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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...