我必须创建具有应在内部控件中使用的公共属性的Silverlight用户控件。
public partial class MyControl : UserControl
{
public static readonly DependencyProperty MyCustomProperty =
DependencyProperty.Register(
"MyCustom", typeof(string), typeof(MyControl),
new PropertyMetadata("defaultValue"));
public string MyCustom
{
...
}
我尝试了几种绑定方式,但所有失败 - 依赖属性都没有出现。 例如,这种简单的绑定失败了:
<UserControl x:Class="...MyControl"
...
x:Name="mc"
>
<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Image Source="{Binding Path=MyCustom, Mode=OneWay, ElementName=mc}" />
</Grid>
</UserControl>
我做错了什么?
答案 0 :(得分:1)
你在做什么并不是一个好的模式。 UserControl并不真正“拥有”name属性。如果另一个UserControl或Page要在其Xaml中放置MyControl
的实例,则可以为其命名而不是“mc”,此时您的代码就会被破坏。
而是使用这种方法: -
<UserControl x:Class="...MyControl"
>
<Grid x:Name="LayoutRoot" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Image Source="{Binding Path=Parent.MyCustom, Mode=OneWay, ElementName=LayoutRoot}" />
</Grid>
</UserControl>
您的主要问题是Image
Source
属性类型为ImageSource
而不是字符串。您可以在Xaml中使用字符串文字,因为Xaml解析器会将字符串转换为ImageSource
。使用绑定时不会发生这种情况。
将您的控件属性更改为: -
public partial class MyControl : UserControl
{
public static readonly DependencyProperty MyCustomProperty =
DependencyProperty.Register(
"MyCustom", typeof(ImageSource), typeof(MyControl),
new PropertyMetadata(null));
[TypeConverter(typeof(ImageSourceConverter))]
public ImageSource MyCustom
{
...
}
现在在托管MyControl
的另一个UserControl或Page中,您可以使用字符串来分配此MyCustom
属性。但是在代码中,您需要创建一个类似BitmapImage
的实例来分配给此属性。