Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > поиск контейнера по элементу


Автор: hexzo 29.8.2011, 10:10
У меня есть ListBox а в нём TextBox.
Код

<ListBox>
  <TextBox/>
</ListBox>


Как мне имея ссылку лишь на TextBox получить ссылку на ListBox его в себе содержащий.

Автор: hexzo 29.8.2011, 15:09
Это может делаться вот так
Код

b1.Click += (sender, EventArgs) =>
        {
          Console.WriteLine(
            LogicalTreeHelper.GetParent(sender as Button) != null
          );
        };



Но если это делается для шаблонного элемента, то способ не работает.

Код

  FrameworkElementFactory facElem = new FrameworkElementFactory(typeof(TextBox));

  System.Windows.Input.KeyEventHandler d = (sender, e) => {
    if (e.Key == System.Windows.Input.Key.Return)          
      Console.WriteLine(
        LogicalTreeHelper.GetParent(sender as TextBox) != null // предок равен нулю
      );
    }
  };

  facElem.AddHandler(TextBox.KeyDownEvent, d );
  dataTemplate.VisualTree = facElem;
  return dataTemplate;

Автор: tol05 29.8.2011, 16:42
попробуйте использовать свойство TemplatedParent.
Псевдокод:

TextBox textBox = (TextBox)e.OriginalSource;
var parent = LogicalTreeHelper.GetParent(textBox.TemplatedParent);

Автор: hexzo 30.8.2011, 10:19
О пасибо. Методом научного тыка получилось, но мне кажется можно сделать как нибудь попроще. Ну что бы не через всё нутро лезть, со стороны заднего фасада.  smile 
Код

            var p1 = LogicalTreeHelper.GetParent( (sender as TextBox).TemplatedParent );
            Console.WriteLine(p1.GetType());
            var p2 = LogicalTreeHelper.GetParent(p1);
            Console.WriteLine(p2.GetType());
            var p3 = System.Windows.Media.VisualTreeHelper.GetParent(p2);
            Console.WriteLine(p3.GetType());
            var p4 = System.Windows.Media.VisualTreeHelper.GetParent(p3);
            Console.WriteLine(p4.GetType());
            var p5 = System.Windows.Media.VisualTreeHelper.GetParent(p4);
            Console.WriteLine(p5.GetType());
            var p6 = System.Windows.Media.VisualTreeHelper.GetParent(p5);
            Console.WriteLine(p6.GetType());
            var p7 = System.Windows.Media.VisualTreeHelper.GetParent(p6);
            Console.WriteLine(p7.GetType());
            var p8 = System.Windows.Media.VisualTreeHelper.GetParent(p7);
            Console.WriteLine(p8.GetType());
            var p9 = System.Windows.Media.VisualTreeHelper.GetParent(p8);
            Console.WriteLine(p9.GetType());
            var p10 = System.Windows.Media.VisualTreeHelper.GetParent(p9);
            Console.WriteLine(p10.GetType());
            var p11 = System.Windows.Media.VisualTreeHelper.GetParent(p10);
            Console.WriteLine(p11.GetType());
            Console.WriteLine( ((ListView)p11).Name );

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)