CodeBehind TextBox Binding - PullRequest
       40

CodeBehind TextBox Binding

0 голосов
/ 20 апреля 2020

Моя цель состояла в том, чтобы заменить <TextBox Text={Binding TopTextContent} /> (который работает как есть) в представлении xaml следующим образом в коде:

  public partial class MyView: UserControl
  {
    public MyView()
    {
      InitializeComponent();

      // Supposed to replace: // <TextBox Text={Binding TopTextContent} />
      InputContextMenu("Top Text", "TopTextContent");
    }

    private void InputContextMenu([NotNull] string header, [NotNull] string propName)
    {
      var textBox = new TextBox
      {
        MaxLength = 12,
        Width = 80,
        FocusVisualStyle = null
      };

      textBox.SetBinding(
        TextBox.TextProperty, 
        new Binding
        {
          Path = new PropertyPath(propName),
          Source = DataContext, // (MyView)DataContext didn't work as well
          Mode = BindingMode.TwoWay
        }
      );

      CodeBehindTextInputs.Items.Add(
        new MenuItem
        {
          Header = header,
          Focusable = false,
          Items = {textBox}
        }
      );
    }
  }

На самом деле это должно работать, но это не так, поле делает появляются, но поле ввода пустое и его изменение не изменяет значение, к которому оно должно быть привязано.

Sn oop показывает его красным:

showcasing that snoop does show {Path=TopTextContent} but in red

Я не уверен, как отлаживать дальше или что я делаю неправильно.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Не устанавливайте явно источник привязки. Привязка будет автоматически использовать DataContext TextBox в качестве исходного объекта - который наследует свое значение от своего родительского элемента представления - даже когда он установлен позже:

textBox.SetBinding(
    TextBox.TextProperty, 
    new Binding
    {
        Path = new PropertyPath(propName),
        Mode = BindingMode.TwoWay
    });
0 голосов
/ 20 апреля 2020

Я еще не до конца понимаю все это, но может показаться, что мой DataContext заполняется ПОСЛЕ конструктора (поэтому он все еще был нулевым).

Я решил это, прибегнув к событию DataContextChanged :

public SpecificInformationView()
{
  InitializeComponent();

  DataContextChanged += OnDataContext;
}

private void OnDataContext(object sender, DependencyPropertyChangedEventArgs e)
{
  InputContextMenu("Top Text", "TopTextContent");
}
...