2012-03-19 33 views
35

Tôi đang đối mặt với một số vấn đề với ràng buộc WPF đối với thuộc tính tĩnh. Trong đơn đăng ký của tôi, có một lớp được gọi là Globals có chứa một thuộc tính tĩnh tĩnh tới ThisAddIn. Đối tượng này cho phép tôi truy cập thuộc tính User mà về cơ bản là những gì tôi muốn sử dụng trong Binding của tôi. Vì vậy, XAML của tôi trông như thế này:Giá trị StaticExtension không thể được giải quyết

<TextBlock Text="{Binding Path=User.Name 
        , Source={x:Static Member=s:Globals.ThisAddIn}}" /> 

Các namespace s được khai báo ở phía trên cùng của dòng sau:

xmlns:s="clr-namespace:ConsoleApplication16.Model" 

Tôi tìm thấy một tấn các cách tiếp cận khác nhau về cách thức để tham khảo tĩnh bất động sản trong XAML, nhưng không ai trong số họ làm việc ngoại trừ này, mà cũng có vẻ hợp lý nhất đối với tôi. Một số mẫu tôi tìm thấy, không sử dụng Đường dẫn hoặc Thành viên. Sau khi một số thử nghiệm tôi đã tìm đúng cách để thực hiện việc này, đang sử dụng "x: Thành viên tĩnh" để xác định lớp và thuộc tính tĩnh bạn muốn sử dụng, trong khi Đường dẫn xác định Thuộc tính chính xác bên trong đối tượng này, giống như một bình thường ràng buộc sẽ làm.

Mặc dù giải pháp này biên dịch mà không có bất kỳ khiếu nại nào, XAMLParseException bật lên trực tiếp cho tôi biết rằng giá trị StaticExtension không thể được giải quyết cho một điều tra, trường tĩnh hoặc thuộc tính tĩnh.

+1

Làm thế nào chính xác là 'way' đúng nếu nó ném một ngoại lệ? –

+0

Ngoài ra bạn sẽ có thể thả 'Path =' và 'Member =' bởi vì điều đó sẽ gọi các contructors tương ứng thiết lập các thuộc tính liên quan. –

+0

Tôi thường liên kết với các lớp/thuộc tính tĩnh bằng cách sử dụng '{Binding Source = {x: Static local: MyStaticClass.SomeStaticProperty.PropertyName}'. Chỉ cần chắc chắn rằng các thuộc tính của bạn có các trình đánh giá 'get' /' set'. Ví dụ, hãy chắc chắn bạn sử dụng 'public string PropertyName {get; bộ; } 'thay vì' publicName PropertyName; ' – Rachel

Trả lời

63

Đảm bảo Globals.ThisAddIn là công khai. Bạn cũng có thể nhận được điều này nếu bạn đang sử dụng một tệp tài nguyên trong trường hợp này, bạn cũng cần đảm bảo công cụ sửa đổi truy cập được đặt thành công khai.

+7

Đúng vậy! Nó không có ý nghĩa rằng tại thời điểm thiết kế giá trị tài sản được thiết lập một cách chính xác sau đó tại thời gian chạy nó không thành công với ngoại lệ này. Rất bối rối. – Steztric

+1

Moly thánh, bạn nói đúng! Tôi chưa bao giờ mơ rằng nhà thiết kế mã sẽ có thể truy cập tài nguyên của tôi vào lúc thiết kế trong khi biên dịch sẽ thất bại với "ExtensionValue không thể được giải quyết" —được gọi là @Steztric viết. Cảm ơn nhiều! – Informagic

+1

Tôi đến đây vì tệp resx của tôi có công cụ sửa đổi nội bộ. Thay đổi nó thành công khai và nó hoạt động Và tương tự, tại thời điểm thiết kế nó hoạt động, veeeery khó hiểu –

7

Trong dự án thư viện đầu ra, bạn nên đảm bảo rằng trình tạo tệp của Resources.resx đã được sửa đổi là PublicResXFileCodeGenerator thay vì ResXFileGodeGenerator theo mặc định.

Thay thế sau đây với ...

Not public resource

này một

correct public resource

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