![](/img/trans.png)
[英]Binding an element in a child View to a property of the parent ViewModel
[英]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.