我可以在XAML中处理抛出的异常吗?

时间:2009-05-05 08:47:33

标签: c# wpf exception xaml

在我的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>

是否可以使用上述代码?

4 个答案:

答案 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/