在我的XAML中,我通过绑定到GetAll属性来获取所有客户:
<ListBox ItemsSource="{Binding GetAll}"
ItemTemplate="{StaticResource allCustomersDataTemplate}"
Style="{StaticResource allCustomersListBox}">
</ListBox>
GetAll属性是我的视图模型中的一个可观察集合,它调用Model来获取所有客户的集合:
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>
像上面的代码一样的东西是可能的吗?
4条答案
按热度按时间2exbekwf1#
首先,我认为捕获XAML异常的目的并不在于此。它们更多地是作为一种工具存在的,以帮助开发人员了解他们需要如何修复XAML代码,尽管由于XAML标记的动态特性,它们当然必须在运行时(初始化)发生
也就是说,通过将对
InitializeComponents
的调用 Package 在Windows
类的构造函数中,可以很容易地处理XAML异常。然后,您可以捕获所有异常,也可以捕获特定的XamlParseException
异常,无论您认为哪种方法合适。this blog post的示例:
de90aj5v2#
如果发生错误,您可以使用FallBackValue来提供一个值,以便在绑定中使用。除了使用FallBackValue之外,您无法在xaml中处理异常。
您可能还想查看TargetNullValue,它使某个值等效于Null(例如,如果您设置TargetNullValue=5,而您的用户输入5,则setter将获得Null,如果getter提供Null,则绑定将显示5)。
a11xaf1n3#
我的第一个想法是,可以使用
ValueConverter
,检查value==null
,然后通过一个转换器参数设置视图模型的某个任意属性,然后在xaml中使用一个常规属性触发器来显示错误。我很肯定你也可以用绑定验证器来做这件事,所以我会先看看那里。
编辑:是的,看一看http://msdn.microsoft.com/en-us/library/ms753962.aspx,了解绑定验证规则的简介,..这将使您走上正确的道路
des4xlb04#
是,您可以使用XAML处理异常它存在于未处理异常中此链接可能会有所帮助.. http://www.wpf-tutorial.com/wpf-application/handling-exceptions/