在我的XAML中,我通过绑定到GetAll属性来获取所有客户:
<ListBox ItemsSource="{Binding GetAll}"
ItemTemplate="{StaticResource allCustomersDataTemplate}"
Style="{StaticResource allCustomersListBox}">
</ListBox>
GetAll属性是我的视图模型中的一个可观察集合,它调用模型来获取所有客户集合:
public class CustomersViewModel
{
public ObservableCollection<Customer> GetAll {
get
{
try
{
return Customer.GetAll;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
如果模型中出现任何问题(格式错误的XML文件等),则异常会一直冒泡到ViewModel中的GetAll属性。
第一个问题:我很惊讶 XAML似乎没有对异常 做任何事情,只是继续并且什么都不显示。这是设计的吗?这是“脱钩方法”的一部分吗?
第二个问题:这让我想到 我可以在某种程度上处理XAML中的异常 ,例如
伪代码:
<Trigger>
<Trigger.OnException>
<TextBox Text="The customer data could not be loaded."/>
</Trigger.OnException>
</Trigger>
是否可以使用上述代码?
答案 0 :(得分:5)
首先,我认为不应该捕获XAML异常。它们更多地作为一种工具来帮助开发人员了解他们如何修复他们的XAML代码,尽管由于XAML标记的动态特性,它们当然必须在运行时(初始化)发生
这样说,您可以通过在InitializeComponents
类的构造函数中包含对Windows
的调用来轻松处理XAML异常。然后,您可以捕获所有例外情况,或者特别是XamlParseException
,无论您发现哪个例外情况。
来自this blog post的示例:
public partial class Window1 : System.Windows.Window
{
public Window1()
{
try
{
InitializeComponent();
}
catch (Exception ex)
{
// Log error (including InnerExceptions!)
// Handle exception
}
}
}
答案 1 :(得分:2)
如果发生错误,您可以使用FallBackValue提供在绑定中使用的值。除了使用FallBackValue之外,您无法处理xaml中的异常。
您可能还想查看TargetNullValue,其中某个值等于Null(例如,如果您设置TargetNullValue = 5并且您的用户输入5,则您的setter将获得Null,如果您的getter提供Null,则绑定将显示5)。
答案 2 :(得分:1)
我的第一个想法是你可以使用ValueConverter
,检查value==null
,然后通过转换器参数设置视图模型的一些任意属性。然后,您可以在xaml中使用常规属性触发器来显示错误。
我很确定你也可以用绑定验证器做到这一点,所以我先看看那里。
编辑:是的,请查看http://msdn.microsoft.com/en-us/library/ms753962.aspx了解绑定验证规则的介绍,......这会让您走上正确的道路
答案 3 :(得分:0)
是的,您可以使用XAML处理异常。它存在未处理的异常。 这个链接可能有帮助.. http://www.wpf-tutorial.com/wpf-application/handling-exceptions/