我是WPF的新手,我正在执行一些模拟尝试了解binding
"事情" (例如{Binding}
,{TemplateBinding}
...)
好的,所以我在这里制作这个样本来测试TemplateBinding
并且效果很好:
<Button Width="100" Height="100">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Image Source="image.png" Width="{TemplateBinding Width}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
现在我尝试了相同但与其他属性:
<Button Width="100" Height="100" Content="image.png">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Image Source="{TemplateBinding Content}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
在第一种情况下,绑定完全发生。但在第二天没有任何事情发生。
我在这里失踪了什么?有些属性可以绑定其他人可以&#t; t?
我真的迷失在这里,有人可以向我解释为什么一个有效,另一个没有?
答案 0 :(得分:2)
package main
import "fmt"
type Ch chan int
type ChIn chan<- int
func test1(in ChIn) {
fmt.Println(in)
}
func test2(in chan<- int) {
fmt.Println(in)
}
func main() {
//test1(make(Ch))
test1(make(chan int))
test2(make(Ch))
test2(make(ChIn))
}
在编译时进行评估,不提供自动值类型转换(在本例中为TemplateBinding
到string
)。只需使用ImageSource
相对源绑定
TemplatedParent
与此问题没有直接关系的另一件事是,如果您想将<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
用于相同类型的其他属性,请确保相应地设置TemplateBinding
。 TargetType
针对TemplateBinding
类型进行评估,默认ControlTemplate
为TargetType
System.Windows.Controls.Control
答案 1 :(得分:1)
您的绑定应该具有匹配的类型。 Button.Content
是object
而Image.Source
期望Uri
。而不是Content
使用Tag
并通过转换器转换它:
<Button Width="100" Height="100" Tag="image.png">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Image Source="{TemplateBinding Tag, Converter={StaticResource ObjectToUriConverter}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
<强>转换器强>
public class ObjectToUriConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
return new Uri(value.ToString());
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
答案 2 :(得分:0)
我认为您可能会获得Content is not recognised or is not accssible error
,而不是<Image Source="{Binding Content,ElementName=btn}" />
btn
是Button Name.