Silverlight:为什么设计师不能看到依赖属性?

时间:2011-03-16 08:25:21

标签: silverlight dependency-properties

我必须创建具有应在内部控件中使用的公共属性的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>

我做错了什么?

1 个答案:

答案 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的实例来分配给此属性。