2009-04-04 1 views
2

Чтобы понять, как работает привязка, я реализовал MyContainer, полученный из FrameworkElement. Этот контейнер позволяет установить «Дети» и добавить их в логическое дерево. Но привязка ElementName не работает. Что я могу сделать с MyContainer, чтобы он работал, оставив родителя как FrameworkElement?MyContainer, полученный из FrameworkElement с поддержкой привязки

C#:

public class MyContainer : FrameworkElement 
{ 
    public MyContainer() 
    { 
     Children = new List<FrameworkElement>(); 
    } 

    public List<FrameworkElement> Children { get; set; } 
    protected override IEnumerator LogicalChildren 
    { 
     get { return Children.GetEnumerator(); } 
    } 
} 

XAML:

<Window x:Class="WpfLogicalTree.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfLogicalTree" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 

     <local:MyContainer> 
      <local:MyContainer.Children> 
       <TextBlock Text="Foo" x:Name="_source" /> 
       <TextBlock Text="{Binding Path=Text, ElementName=_source}" x:Name="_target"/> 
      </local:MyContainer.Children> 
     </local:MyContainer> 

     <Button Click="Button_Click">Test</Button> 

    </StackPanel> 
</Window> 

Window1.cs

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show(_target.Text); 
} 

ответ

3

Вместо использования LogicalChildren я должен был позвонить AddLogicalChild. Так это работает:

public class MyContainer : FrameworkElement 
{ 
    public MyContainer() 
    { 
     Children = new List<FrameworkElement>(); 
     this.Loaded += new RoutedEventHandler(OnLoaded); 
    } 

    void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     foreach (FrameworkElement fe in Children) 
      this.AddLogicalChild(fe); 
    }   

    public List<FrameworkElement> Children { get; set; } 
} 

AddLogicalChild устанавливает логические родительский элемент, это необходимо, чтобы найти NameScope, где было зарегистрировано название «_source». В нашем случае область имени - это окно1.

Примечание. AddLogicalChild не приведет к тому, что LogicalChildren автоматически вернет наших детей, он установит только Parent. Таким образом, LogicalTreeHelper.GetChildren будет пустой коллекцией. Но здесь он здесь не нужен.

 Смежные вопросы

  • Нет связанных вопросов^_^