将子元素属性绑定到父元素
本文关键字:元素 绑定 属性 | 更新日期: 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}" />