簡體   English   中英

我可以在XAML中處理拋出的異常嗎?

[英]Can I handle thrown exceptions in XAML?

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

是否可能像上面的代碼?

首先,我認為不應該捕獲XAML異常。 它們更多地作為一種工具來幫助開發人員了解他們如何修復他們的XAML代碼,盡管由於XAML標記的動態特性,它們當然必須在運行時(初始化)發生。

這樣說,您可以通過在Windows類的構造函數中包含對InitializeComponents的調用來輕松處理XAML異常。 然后,您可以捕獲所有異常或特別是XamlParseException ,無論您找到合適的。

此博客文章的示例:

public partial class Window1 : System.Windows.Window 
{
    public Window1()
    {
        try
        {
            InitializeComponent();
        }
        catch (Exception ex)
        {
            // Log error (including InnerExceptions!)
            // Handle exception
        }
    }
}

如果發生錯誤,您可以使用FallBackValue提供在綁定中使用的值。 除了使用FallBackValue之外,您無法處理xaml中的異常。

您可能還想查看TargetNullValue ,它使得某個值等於Null(例如,如果您設置TargetNullValue = 5並且您的用戶輸入5,則您的setter將獲得Null,如果您的getter提供Null,則綁定將顯示5)。

我的第一個想法是你可以使用ValueConverter ,檢查value==null然后通過converter參數設置視圖模型的一些任意屬性。 然后,您可以在xaml中使用常規屬性觸發器來顯示錯誤。

我很確定你也可以用綁定驗證器做到這一點,所以我先看看那里。

編輯:是的,請查看http://msdn.microsoft.com/en-us/library/ms753962.aspx獲取綁定驗證規則的介紹,...這將使您走上正確的道路

是的,您可以使用XAML處理異常。 它存在未處理的異常。 這個鏈接可能會有所幫助.. http://www.wpf-tutorial.com/wpf-application/handling-exceptions/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM