繁体   English   中英

将子元素属性绑定到父元素

[英]Binding child element property to parent element

我有一个Button,其中嵌入了一个图像。现在我想要的是将按钮的tag属性绑定到图像的Source属性。

<Button Name="Jobs" Tag={Binding ???} Click="button_click">
  <Button.Content>
    <Image Source="{StaticResource nsds}"/>
   <Button.Content>
</Button>

我希望它是通用的,因为每个将要创建的按钮都将具有此Image内容,并且按钮创建将动态完成。 使用图像名称绑定将失败目的Tag={Binding ElementName=Img, Path=Source}因为我必须使用图像源在其他地方重新创建图像。

在示例中,您提供了实现目标的最简单方法是在Self模式下使用与相对源的绑定:

<Button Tag="{Binding Content.Source, RelativeSource={RelativeSource Self}}" (...)>
    <Button.Content>
        <Image Source="{StaticResource nsds}"/>
    <Button.Content>
</Button>

这是因为Content的值是Image ,因此相对于Button本身的Content.Source路径指向图像的源。 但是,如果Image控件不是按钮的实际内容(例如,它嵌套在Grid等中),这将停止工作。

鉴于您所关注的内容,将图像设置为按钮的内容并使用模板可能更合乎逻辑:

<Button Content="{StaticResource nsds}">
    <Button.ContentTemplate>
        <DataTemplate>
            <Image Source="{Binding}" />
        </DataTemplate>
    </Button.ContentTemplate>
</Button>

我认为,这是对模型的更精确表示 - 按钮的逻辑内容是实际图像,而Image控制只是显示该图像的一种手段。 这个解决方案有一个缺点 - Button.Content属性的值不会自动转换为ImageSource对象,但会包含原始值,在你的情况下是nsds对象(可能是一个表示URI的string ,但你知道更好的是什么它是)。

编辑

如果我正确理解你的评论,你想设计一种方法来最小化你需要编写的代码来定义这样一个按钮 - 你建议将它包装在某种用户控件中。 这可以做到,但通常在这种情况下,你想将几个属性设置器放入一个逻辑包中,最好使用Style这样做。

在这种情况下,您可以将Style定义为某个地方的资源:

<Style x:Key="nsdsButton" TagetType="{x:Type Button}">
    <Setter Property="Content" Value="{StaticResource nsds}" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Image Source="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后,只要你想定义这样的按钮,你只需要写:

<Button Style="{StaticResource nsdsButton}" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM