WPF - 如何摆脱错误的设计时错误

时间:2011-09-02 06:47:15

标签: wpf

在设计时,我有一些错误的错误,似乎是由于WPF无法在没有实际运行的情况下估计事物的价值。这当然在运行时完美无缺。 问题是如何摆脱这些错误?

以下是一个例子:

我在课堂上有以下两个:

public static bool IsHubb {get; set;} 
public static bool IsEC { get { return !IsHubb; } }

以下转换器运行良好:

   public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (HubbCostOfferPage.IsHubb && HubbCostOfferPage.CarObj.TestApprovedDate == null)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }

然而,以下(虽然非常相似)给出了“对象引用未设置为对象的实例”。错误,这意味着我可以在设计时看到唯一没有注释掉StaticResource定义的东西是一个很大的错误:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}

如果我用HubbCostOfferPage.IsHubb替换HubbCostOfferPage.IsEC,一切正常,所以我知道存在问题所在。

如果我用转换器中的!HubbCostOfferPage.IsHubb替换HubbCostOfferPage.IsEC,我会遇到同样的问题。设计师似乎抱怨,因为它无法评估“!”在设计期间。

如何在设计时间内完成这项工作?

3 个答案:

答案 0 :(得分:2)

基于Pauls答案我建议不要检查CarObj是否为空,因为在运行时期间应该抛出异常。

我建议您按以下方式更改转换器:

public object Convert(object value, Type targetType, object parameter,  
  System.Globalization.CultureInfo culture)  
{  
  if (ApplicationIsInDesignMode) { return Visibility.**WHATEVER YOU LIKE ***; }
  if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
    return Visibility.Visible;
else
    return Visibility.Collapsed;
}

private static bool ApplicationIsInDesignMode
    {
        get { return (bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue); }
    }

答案 1 :(得分:1)

关闭设计师 - 这比它的价值更麻烦。将.xaml文件与代码编辑器关联(右键单击,打开,然后设置为默认值),您将获得更快的体验,并且仍然具有智能感知。您可以在需要时使用Blend。

答案 2 :(得分:0)

public object Convert(/*snipped*/)
{
#if DEBUG
    if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
        return Visibility.Visible;
#endif
    if (HubbCostOfferPage.IsEC == true && HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}

编辑:乍一看,设计师可能会抱怨因为HubbCostOfferPage.CarObj为空。您也可以通过将代码更改为:

来解决此问题
public object Convert(/*snipped*/)
{
    if (HubbCostOfferPage.IsEC && 
        HubbCostOfferPage.CarObj != null &&
        HubbCostOfferPage.CarObj.TestApprovedDate == null)
        return Visibility.Visible;
    else
        return Visibility.Collapsed;
}

这也会产生更好的生产代码的副作用。

第二次编辑以回复您的评论,因为这将需要代码:

  

正如我所写的那样,用IsHubb取代IsEC解决了这个问题并且放了一个!在IsEC导致它之前,所以它绝对不是CarObj的问题。

启动时,IsHubb初始化为false。 C#短路布尔逻辑,所以在下面:

if (HubbCostOfferPage.IsHubb && ...

逻辑上的所有内容并且 NOT 被评估。将代码更改为:

if (HubbCostOfferPage.IsEC == true && ...

现在正在评估&&之后的所有内容。诸如bool之类的整数类型不会成为“对象引用未设置为对象实例”的目标,显然HubbCostOfferPage不是空的,因此可能的罪魁祸首是CarObj。没有看到你的代码,这只是一个建议的想法。

关于问题的第二部分,DEBUG指令只编译出在发布模式下编译时设计者检查的代码。如果您在发布模式下进行任何设计时编辑,则可以删除它们。你需要的部分就是中间的一切。