我正在开发自定义控件。这个自定义控件有一个像这样的图像:
<Image Source="{TemplateBinding Poster}" />
在我的C#文件中,DependencyProperty
如下:
public static readonly DependencyProperty PosterProperty = DependencyProperty.Register(
nameof(Poster),
typeof(ImageSource),
typeof(MovieButton),
new UIPropertyMetadata(null));
public ImageSource Poster
{
get { return (ImageSource)GetValue(PosterProperty); }
set { SetValue(PosterProperty, value); }
}
现在,我可以在XAML中将以下内容添加到我的用户控件中:Poster="Images/NoPoster.png"
或Poster = new BitmapImage(new Uri(@"pack://application:,,,/Images/NoPoster.png"))
来自代码。
一切都很好。我想知道的是,为什么我不能将Poster
声明为BitmapImage
或string
而不是ImageSource
?
答案 0 :(得分:3)
您当然可以将其声明为BitmapImage
。但这将是一个不必要的限制,因为基类ImageSource
就足够了。
您也可以使用string
或Uri
作为属性类型,但是您应该通过常规Binding替换TemplateBinding,因为源和目标属性类型不再匹配,并且内置自动类型转换应该发生:
<Image Source="{Binding Poster, RelativeSource={RelativeSource TemplatedParent}}" />
请注意,您不需要显式绑定转换器,因为类型转换是由ImageSourceConverter
类自动执行的,该类已注册为ImageSource
的类型转换器。