在设计时,我有一些错误的错误,似乎是由于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,我会遇到同样的问题。设计师似乎抱怨,因为它无法评估“!”在设计期间。
如何在设计时间内完成这项工作?
答案 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指令只编译出在发布模式下编译时设计者检查的代码。如果您在发布模式下进行任何设计时编辑,则可以删除它们。你需要的部分就是中间的一切。