gpt4 book ai didi

WPF,与 TemplatedParent 绑定(bind)时有趣的事情

转载 作者:行者123 更新时间:2023-12-02 01:46:25 24 4
gpt4 key购买 nike

控件模板:

    <ControlTemplate x:Key="BasicShape2">
<StackPanel Name="sp">
<Border Name="bd" CornerRadius="3.5" BorderThickness="1" BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent},Path=DataContext.NodeType, Converter={StaticResource NodeTypeColorConverter}, Mode=OneWay}" Height="32" Padding="1">
<TextBlock Name="tbName" Grid.Column="1" Text="" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" />
</Border>
</StackPanel>
</ControlTemplate>

此模板将应用于的类:

    public class MyThumbEx : Thumb
{
public static readonly DependencyProperty MemberInfoProperty = DependencyProperty.Register("MemberInfo", typeof(FamilyMemberInfo), typeof(MyThumbEx));
public FamilyMemberInfo MemberInfo
{
get { return (FamilyMemberInfo)GetValue(MemberInfoProperty); }
set { SetValue(MemberInfoProperty, value); }
}

public MyThumbEx(ControlTemplate template, FamilyMemberInfo info, Point position)
{
this.MemberInfo = info;
this.DataContext = this.MemberInfo;
this.Template = template;
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.ApplyTextContent();
}

public void ApplyTextContent()
{
TextBlock tbName = this.Template.FindName("tbName", this) as TextBlock;
if (tbName != null)
{
tbName.Text = this.MemberInfo.Name;
}
}
}

初始化并将其显示在 Canvas 上:

        public MainWindow()
{
InitializeComponent();
//
FamilyMemberInfo mi = new FamilyMemberInfo();
mi.Name = "someone";
mi.ID = "id1";
MyThumbEx te = new MyThumbEx(Application.Current.Resources["BasicShape2"] as ControlTemplate, mi, new Point(0, 0));
//
this.cvMain.Children.Add(te);
}

这些代码工作正常,但请注意,在控件模板中,我必须设置 Path=DataContext.NodeType,而不仅仅是 Path=NodeType。我是 WPF 新手,我发现通常情况下,当我在不使用此模板内容的情况下进行绑定(bind)时,我不需要指定谓词“DataContext”,对吧?为什么我们需要这里?

我发现的另一件事是,我可以注释掉 this.DataContext = this.MemberInfo,并将绑定(bind)路径更改为 Path=MemberInfo.NodeType,代码仍然可以正常工作。谁能帮我解释一下吗?

提前致谢!

最佳答案

如果您不手动更改 DataContext,则每个子级都会自动拥有其父级的 DataContext。因此,如果您的 window 有 f.e. ViewModel 作为 DataContext,其所有控件都可以通过 {Binding Path=Property} 访问 ViewModels 属性。

但是对于 ControlTemplate,DataContext 只是从父级级联到子级的通常典型流程并不适用于此。因此,您必须首先设置 DataContext,通过 Property="{BindingrelativeSource={RelativeSource TemplatedParent}, Path=DataContext.Property}"DataContext="{BindingRelativeSource={RelativeSource TemplatedParent},Path=DataContext}"Property="{Binding Path=Property}"

对于你的第二点:ControlTemplate 可能会自动使用其包含元素的代码隐藏作为 DataContext,因此你可以使用代码隐藏属性而不设置 DataContext,但我不是 100% 确定这个。

关于WPF,与 TemplatedParent 绑定(bind)时有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967478/

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