1

我有一些简单的依赖属性不起作用。我查看了它们,查看了我过去使用过的代码,但我不确定它们为什么不起作用。

我有一个扩展 UserControl 的自定义基类 (MyBaseControl),然后我的自定义 UI 控件在其上进行扩展。例如,MyCustomControl 扩展了 MyBaseControl。

MyCustomControl XAML 很简单:

<StackPanel>
    <Image Source="{Binding Icon}" />
    <TextBlock Text="{Binding Blurb}" />
</StackPanel>

MyCustomControl 代码如下所示:

public partial class MyCustomControl: MyBaseControl
{
    //public static readonly DependencyProperty IconProperty = Image.SourceProperty.AddOwner(typeof(MyCustomControl));
    //public static readonly DependencyProperty BlurbProperty = TextBlock.TextProperty.AddOwner(typeof(MyCustomControl));

    public static readonly DependencyProperty IconProperty =
        DependencyProperty.Register(
        "Icon",
        typeof(ImageSource),
        typeof(MyCustomControl),
        new PropertyMetadata(null));

    public static readonly DependencyProperty BlurbProperty =
        DependencyProperty.Register(
        "Blurb",
        typeof(String),
        typeof(MyCustomControl),
        new PropertyMetadata(null));

    public MyCustomControl() : base()
    {
        InitializeComponent();
    }

    #region Properties

    public ImageSource Icon
    {
        get { return (ImageSource)GetValue(IconProperty); }
        set { SetValue(IconProperty, value); }
    }

    public String Blurb
    {
        get { return (String)GetValue(BlurbProperty); }
        set { SetValue(BlurbProperty, value); }
    }

    #endregion Properties
}

请注意,我尝试了几种不同的方法来定义DependencyProperty. 两者都不起作用。

我通过以下方式调用我的控件:

<ctrl:MyCustomControl Height="240" VerticalAlignment="Center" HorizontalAlignment="Center" Width="320" Blurb="Slide Show" Icon="pack://application:,,,/Resources/photo_scenery.png" />

如果我直接在 XAML 中设置 Source 或 Text,它们会显示得很好。绑定只是不想正常工作。

我错过了什么不允许我的绑定通过?

感谢您的任何帮助!

更新:我已经根据我尝试过的评论和其他更改更新了代码。

4

2 回答 2

4

您正在错误地注册 Icon 属性。在其注册方法中,您需要指定 DP 名称,即代替“ IconProperty”应该是“ Icon”-

public static readonly DependencyProperty IconProperty =
        DependencyProperty.Register(
        "Icon",
        typeof(ImageSource),
        typeof(MyCustomControl),
        new PropertyMetadata(null));

另外,尝试像这样在绑定中设置 RelativeSource -

<StackPanel>
    <Image Source="{Binding Icon, RelativeSource={RelativeSource 
            Mode=FindAncestor, AncestorType={x:Type ctrl:MyCustomControl}}}" />
    <TextBlock Text="{Binding Blurb, RelativeSource={RelativeSource 
            Mode=FindAncestor, AncestorType={x:Type ctrl:MyCustomControl}}}" />
</StackPanel>
于 2012-07-19T18:01:13.700 回答
0

或者,您可以通过如下更新代码来解决问题,而不是按照 Rohit Vats 的建议设置 RelativeSource

<StackPanel>
    <Image Name="imgImage" Source="{Binding Icon}" />
    <TextBlock Name="txtTextBlock" Text="{Binding Blurb}" />
</StackPanel>

public LabeledTextBox()
{
    InitializeComponent();
    imgImage.DataContext = this;
    txtTextBlock.DataContext = this;
}
于 2017-09-08T22:43:46.780 回答