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

本文关键字:元素 绑定 属性 | 更新日期: 2023-09-27 18:04:28

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

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

我希望它是一般的,因为每个按钮将被创建将有这个图像内容和按钮创建将动态完成。与图像名称绑定将破坏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,因此Content.Source相对于Button本身的路径指向图像的源。但是,如果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}" />