“System.Windows.Data.Binding”类型的对象无法转换为“System.String”类型

时间:2011-05-23 16:37:09

标签: .net data-binding mvvm

我想知道是否有人可以提供帮助。我现在已经半天不停地反对这个问题了,我一定是做错了。我有一个具有许多依赖项属性的自定义控件。

[TemplatePart(Name = InformationBubble.InformationBubbleTitlePart, Type = typeof(TextBlock))]
[TemplatePart(Name = InformationBubble.InformationBubbleProductImagePart, Type=typeof(Image))]

public class InformationBubble : Control 
{
    #region Template Parts Name Constants

    /// <summary>
    /// Name constant for the Information Bubble Title Part
    /// </summary>
    public const string InformationBubbleTitlePart = "InformationBubbleTitleText";

    /// <summary>
    /// Name constant for the Information Bubble Product Image Part
    /// </summary>
    public const string InformationBubbleProductImagePart = "InformationBubbleProductImage";

    #endregion

    #region TemplateParts

    private TextBlock _Title;

    internal TextBlock Title
    {
        get { return _Title; }
        private set
        {
            _Title = value;

            if (_Title != null)
            {
                _Title.Text = this.ProductTitleText;       
            }
        }
    }

    private Image _ProductImage;

    internal Image ProductImage
    {
        get { return _ProductImage; }
        private set
        {
            _ProductImage = value;

            if (_ProductImage != null)
            {
                _ProductImage.Source = this.ProductImageSource;
            }
        }
    }

    #endregion

    #region Public String Product Title 

    // Dependency properties declaration
    public static readonly DependencyProperty ProductTitleProperty = DependencyProperty.Register(
        "ProductTitle",
        typeof(string),
        typeof(InformationBubble),
        new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnProductTitleChanged)));

    public static void OnProductTitleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        InformationBubble iBubble = sender as InformationBubble;

        if (iBubble.Title != null)
        {
            iBubble.Title.Text = e.NewValue as string;
        }
    }

    public string ProductTitleText
    {
        get { return GetValue(ProductTitleProperty) as string; }
        set { SetValue(ProductTitleProperty, value); }
    }

    #endregion

    #region Public Image Source Product Image

    public static readonly DependencyProperty ProductImageSourceProperty = DependencyProperty.Register(
        "ProductImageSource",
        typeof(ImageSource),
        typeof(InformationBubble),
        new PropertyMetadata(null, new PropertyChangedCallback(OnProductImageSourceChanged)));

    public static void OnProductImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        InformationBubble iBubble = sender as InformationBubble;

        if (iBubble.ProductImage != null)
        {
            iBubble.ProductImage.Source = e.NewValue as ImageSource;
        }
    }

    public ImageSource ProductImageSource
    {
        get { return GetValue(ProductImageSourceProperty) as ImageSource; }
        set { SetValue(ProductImageSourceProperty, value); }
    }

    #endregion

    public InformationBubble()
    {
         this.DefaultStyleKey = typeof(InformationBubble);
    }

    #region Overrides

    public override void OnApplyTemplate()
    {       
        base.OnApplyTemplate();

        Title = GetTemplateChild(InformationBubble.InformationBubbleTitlePart) as TextBlock;
        ProductImage = GetTemplateChild(InformationBubble.InformationBubbleProductImagePart) as Image;
    }

    #endregion

    #region Private Methods

    private void GoToState(string stateName, bool useTransitions)
    {
        VisualStateManager.GoToState(this, stateName, useTransitions);
    }

    #endregion
}

现在,如果我在我的xaml中的某个地方使用此控件,那么如果我这样做,它就会起作用:

<controls:InformationBubble 
        ProductImageSource="{Binding SelectedItem.NormalImageSource}"
        ProductTitleText="Test Title"
        "/>

但是如果我尝试将产品标题文本绑定到ViewModel中SelectedItem对象的title属性:

<controls:InformationBubble 
            ProductImageSource="{Binding SelectedItem.NormalImageSource}"
            ProductTitleText="{Binding SelectedItem.Title, Mode=TwoWay"
            "/>

我得到'System.Windows.Data.Binding'类型的Object无法转换为'System.String'类型。 TextBlock的text属性是DependencyProperty,所​​以我必须遗漏一些明显的东西。

非常感谢任何帮助或见解。

克里斯

1 个答案:

答案 0 :(得分:7)

可能是该属性的名称是错误的。下面代码中的“ProductTitle”应该是“ProductTitleText”吗?

public static readonly DependencyProperty ProductTitleProperty = DependencyProperty.Register(
    "ProductTitle",  // "ProductTitleText" ?
    typeof(string),
    typeof(InformationBubble),
    new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnProductTitleChanged)));

我想当你使用字符串常量时,WPF使用反射直接访问属性“public string ProductTitleText”。 DependencyProperty被忽略,因为属性的名称不匹配(“ProductTitle”与“ProductTitleText”)。

因此,对于标题,您有一个名为“ProductTitle”的依赖项属性和一个名为“ProductTitleText”的(字符串)属性。 对于ProductImage,您有一个名为“ProductImageSource”的依赖项proeprty和一个名为“ProductImageSource”的属性(ImageSource类型)。

有意义吗?