【问题标题】:Invalid Cast Exception when trying to convert a property of a user control in a binding尝试在绑定中转换用户控件的属性时出现无效的强制转换异常
【发布时间】:2009-08-25 15:47:12
【问题描述】:

我有一个带有文本框的用户控件。我试图通过在 UserControl 中实现具有相同名称的 DependencyProperty 来公开 texbox 的 Text 属性。因此:

public static readonly DependencyProperty TextProperty =
   DependencyProperty.Register("Text",
                                typeof(string),
                                typeof(UserControlWithTextBox),
                                new UIPropertyMetadata(string.Empty));
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set 
        {
            SetValue(TextProperty, value);
            textBox.Text = value;
        }
    }

get 部分在我的应用程序中似乎可以正常工作。但是,我尝试使用转换器将按钮的 IsEnabled 属性绑定到其中两个 UserControls 的 Text 属性,该转换器将检查两个 UserControls 的 Text 属性是否都是空字符串。应用程序窗口加载时出现以下错误:

System.InvalidCastException 未处理 Message="无法将 MS.Internal.NamedObject 类型的对象转换为 System.String 类型。"

Convert 方法如下所示:

  public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return (string) values[0] != string.Empty &&
               (string) values[1] != string.Empty;
    }

在抛出异常时,values[0] 和 values[1] 的值都为 DependencyProperty.UnsetValue。

我哪里出错了?

【问题讨论】:

    标签: c# .net wpf user-controls dependency-properties


    【解决方案1】:

    根据您的异常判断 values[0] 和 values[1] 不是字符串,因此当您尝试显式转换它们时它会中断。

    为了避免这些类型的事情,您应该真正将您的 TextBoxes 绑定到公共属性,然后将您的按钮 IsEnabled 绑定到另一个公共属性,该属性在 getter 中将通过检查它们绑定到的属性来检查 TextBoxes 是否为空。

    【讨论】:

    • 谢谢。问题比我想象的要简单得多。重命名 UserControl 实例本身后,我忘记重命名 ElementName="MyUserControlInstance"...
    • 有时是小事让你发疯......哦,我一直在开玩笑...... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多