2010-10-26 30 views
28

WPF là một bộ công cụ tuyệt vời và dữ liệu XAML rất mạnh, nhưng tôi thường gặp khó khăn phát sinh từ tính minh bạch của nó: Có thể khó khăn khi gỡ lỗi một lỗi dữ liệu khi không có lỗi.Có một công cụ tốt để gỡ lỗi hành vi/lỗi dữ liệu của XAML trong thời gian chạy không?

Ví dụ, tôi gần đây đã phải thay đổi một tuyên bố Style như thế này:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

Into này:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.TestProperty}" Value="False"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

Để cho tài sản DataGridRow bị ảnh hưởng. Sẽ rất hữu ích nếu thấy, tại thời điểm thiết kế hoặc thời gian chạy, ý nghĩa của việc gắn kết với các nguồn khác nhau và RelativeSource sẽ là như thế nào.

Có bất kỳ công cụ/kỹ thuật nào tồn tại không?

Trả lời

30

Bạn có thể sử dụng PresentationTraceSources.TraceLevel thuộc tính đính kèm trên các kết buộc để ghi nhật ký chi tiết trong đầu ra trong khi chạy.

Trong trường hợp của bạn, nó sẽ giống như thế này:

<DataGrid.RowStyle> 
    <Style> 
     <Style.Triggers> 
      <DataTrigger Value="False" Binding="{Binding DataContext.TestProperty, 
        RelativeSource={RelativeSource AncestorType=UserControl}, 
        PresentationTraceSources.TraceLevel=High}"> 
       <Setter Property="DataGridRow.Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 
+5

Điều này chắc chắn đã giúp - được chấp nhận! Để hoàn thiện, vì việc kiểm tra cây trực quan trong thời gian chạy là mối quan tâm liên quan, tôi cũng muốn chỉ ra [Snoop] (http://www.blois.us/Snoop/) cho bất kỳ ai vẫn không biết về sự quyến rũ của nó. –

+1

Phiên bản Snoop mới nhất có thể tìm thấy trên CodePlex: http://snoopwpf.codeplex.com/ –

+0

Hữu ích cho tôi là Tracelevel chính xác trên cửa sổ đầu ra. Tùy chọn> Gỡ lỗi> Cửa sổ đầu ra> Ràng buộc dữ liệu. Như mô tả ở đây: http://karlshifflett.wordpress.com/2010/06/24/visual-studio-2010-wpf-trace-settings-default-is-incorrect – uli78

3

Nếu bạn chạy ứng dụng của mình trong trình gỡ rối Visual Studio, các lỗi ràng buộc sẽ được báo cáo đến cửa sổ đầu ra. Đây là những thông tin rất hữu ích và sẽ giúp bạn theo dõi bất kỳ lỗi nào.

4

Bea Stollnitz có một bài đăng blog rất nhiều thông tin về debugging WPF bindings.

Nếu bạn đang sử dụng Visual Studio 2010, bạn sẽ cần phải update the default WPF trace setting.

+0

+1 Cảm ơn rất nhiều vì đã chỉ ra sự cần thiết phải cập nhật cài đặt VS2010; Tôi đã đốt cháy rất nhiều thời gian trên cái đó. –

0

Tùy chọn khác trong Visual Studio 2010 là đặt điểm ngắt trên liên kết. Điều này có thể dễ dàng được thực hiện bằng cách nhấp vào từ khóa Binding và nhấn F9 để đặt điểm ngắt. Từ khóa Binding sẽ được đánh dấu màu đỏ. Nếu một đoạn văn lớn hơn được đánh dấu, có thể là điểm ngắt không hoạt động trong trình chỉnh sửa mà bạn đang sử dụng. Nếu điều này xảy ra, hãy thử kích chuột phải vào tệp trong Solution Explorer, chọn "Open with" và chọn "Source Code (Text) Editor".

Khi bạn nhấn điểm ngắt trong thời gian chạy, bạn có thể kiểm tra nó bằng cách sử dụng cửa sổ trình gỡ lỗi cục bộ và xem những gì nó được ràng buộc.

+4

Điều này không làm việc cho tôi trong Visual Studio 2010: khi xem tệp XAML, không có tùy chọn điểm ngắt xuất hiện trong trình đơn Gỡ lỗi và nhấn F9 bằng con trỏ trên '{Binding ...' không có hiệu lực. Bạn có thể làm rõ những gì bạn đang làm (có lẽ với một ảnh chụp màn hình) để đạt được điều này? –

Các vấn đề liên quan