gpt4 book ai didi

wpf - MyContainer 从 FrameworkElement 派生并支持绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 07:08:36 24 4
gpt4 key购买 nike

为了了解绑定(bind)的工作原理,我实现了从 FrameworkElement 派生的 MyContainer。此容器允许设置子项并将它们添加到逻辑树中。但是 ElementName 的绑定(bind)不起作用。我可以用 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>

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

最佳答案

我不得不调用 AddLogicalChild,而不是使用 LogicalChildren。所以这有效:

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 设置元素的逻辑父级,这是查找注册“_source”名称的 NameScope 所必需的。在我们的例子中,名称范围是 Window1。

笔记。 AddLogicalChild 不会导致 LogicalChildren 自动返回我们的 child ,它只会设置 Parent。所以 LogicalTreeHelper.GetChildren 将是空集合。但我们这里不需要它。

关于wpf - MyContainer 从 FrameworkElement 派生并支持绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com