【问题标题】:Setting WPF nested control properties from the parent control从父控件设置 WPF 嵌套控件属性
【发布时间】:2009-03-25 21:56:46
【问题描述】:

我有一个 WPF 窗口,上面有多个 ListBox 控件,它们都共享我在这里简化的相同样式:

   <Style x:Key="listBox" TargetType="{x:Type ListBox}">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border BorderBrush="Black">
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Text="{Binding Path=name}" />
                            <TextBlock Text="{Binding Path=text}" />
                            <TextBlock Text="id:" />
                            <TextBlock x:Name="_idTextBlock" Text="{Binding Path=id}" />
                            <Button Name="btnGet" CommandParameter="{Binding Path=id}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

下面是使用该样式的 ListBox 控件之一的示例:

<ListBox x:Name="lbCampaigns" Button.Click="lbCampaigns_Click" ItemsSource="{Binding}" Style="{StaticResource listBox}" />

如何在父 ListBox 中设置 Button 控件 (btnGet) 的内容?

我知道我希望按钮在设计时为 Window 上的每个 ListBox 显示什么文本。 (即我不需要将它绑定到 ListBox ItemsSource)。我看到我可以定义子控件的事件(请参阅 Button.Click 定义),但似乎无法以相同的方式设置子控件的属性。

有什么想法吗? 谢谢!

【问题讨论】:

    标签: .net wpf xaml


    【解决方案1】:

    您的Button.Click 设置未将事件处理程序分配给按钮。它将它分配给ListBox。它的工作原理是 WPF 的路由事件系统。

    如果您希望Button 采用在ListBox 级别设置的值,则在这种情况下,一种选择是将BindingRelativeSource 一起使用:

    <Button Content="{Binding Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>
    

    在这种情况下,我刚刚劫持了Tag 属性,您可以指定如下:

    <ListBox Tag="This is the button's content" .../>
    

    另一种选择是使用继承的附加属性。例如:

    <Button Content="{Binding local:MyClass.MyAttachedProperty}"/>
    

    然后:

    <ListBox local:MyClass.MyAttachedProperty="This is the button's content"/>
    

    最后,如果您正在模板化ListBox 本身,您可以“伸出”并使用TemplateBinding 绑定到您正在模板化的控件的属性:

    <Button Content="{TemplateBinding Tag}"/>
    

    当然,这种技术通常与模板化控件上特别声明的属性一起使用。例如,您可以继承 ListBox 并添加您自己的 ButtonContent 属性。然后,在您的模板中,您可以从Button 联系并绑定到该属性。

    【讨论】:

    • 您好,肯特,感谢您的帮助。您的 FindAncestor 代码 sn-p 中有错字吗?当我将其复制粘贴到我的按钮内容属性中时,我得到一个“必须为 FindAncestor 模式下的 RelativeSource 指定 AncestorType”。错误。我会继续寻找,但我想我会提到它,以防你能提供更多帮助。:)
    • 呸,看起来像 VisualStudio 错误。我做了一个解决方案重建,错误消失了!感谢您的帮助。
    • 是的,这是粘贴与相对源的绑定时的常见错误。我一直都有。
    • @Scott:不客气。我只是对我的帖子进行了一些编辑,以使其更加清晰和全面。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2023-03-13
    • 2018-05-19
    • 1970-01-01
    • 2011-05-20
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多