2009-12-21 6 views
5

Tôi có một tình huống mà một số giá trị ứng dụng được lưu trữ dưới dạng hằng số - đây là yêu cầu khi chúng cần thiết trong định nghĩa thuộc tính (thuộc tính phải giải quyết tại thời gian biên dịch. công việc).Ràng buộc vào trường const trong Silverlight

Tôi cũng muốn có thể sử dụng lại các giá trị này trong các tệp XAML. Vì vậy, nếu tôi có hằng số của tôi như thế này:

public class MyConstants 
{ 
    public const string Constant1 = "Hello World"; 
} 

Tôi muốn một cách ràng buộc họ phải kiểm soát quy định tại XAML một cái gì đó như thế này:

<TextBlock Text="{Binding MyConstants.Constant1}" /> 

Đây có phải là có thể một cách thẳng về phía trước? Tôi đã xem xét các ví dụ ràng buộc nhưng dường như không thể tìm thấy loại kịch bản này.

Nên có lẽ có một số loại công việc xung quanh tôi có thể làm (có thể ràng buộc dịch sang các thông số cho một phương pháp mà tự động kéo các lĩnh vực liên tục thông qua phản ánh)

Trả lời

5

Dưới đây là cách tiếp cận tôi sẽ thực hiện: -

Qua ra XAML Tôi sẽ sử dụng một cú pháp StaticResource như thế này: -

<TextBlock Text="{StaticResource MyConstants_Constant1}" /> 

Tạo phương thức tĩnh ở đâu đó trả về một ResourceDictionary và mất Type làm tham số. Hàm này sử dụng sự phản chiếu để liệt kê tập hợp các hằng số công khai mà nó phơi bày. Nó thêm giá trị chuỗi của mỗi hằng số vào ResourceDictionary xây dựng tên khóa từ tên Type và tên Consts.

Khi đăng ký khởi động ứng dụng typeof(MyConstants) vào chức năng này, hãy thêm ResourceDictionaries trả lại vào bộ sưu tập trong thuộc tính Tài nguyên ứng dụng MergedDictionaries.

Bây giờ tất cả các tài nguyên tĩnh sẽ giải quyết chính xác, không cần phải gọi bất kỳ ràng buộc hoặc đặt bất kỳ datacontext nào để làm việc này. Giá trị được giải quyết trong khi phân tích cú pháp XAML.

+0

Đây chính là loại giải pháp mà tôi đang tìm kiếm, cảm ơn bạn. – David

+0

@Anthony, bạn có thể dán mã ở đây không. Tôi hơi bối rối trong phần mô tả của bạn. cảm ơn. –

+0

Tôi cũng đã thêm một giải pháp ở đây, nhưng Visual Designer sẽ không được phản ánh, mặc dù hiệu ứng thời gian chạy là chính xác. –

4

Bạn có thể làm điều này, nhưng chỉ khi bạn thực hiện một tài sản trả về hằng số. Ràng buộc chỉ hoạt động với các thuộc tính. Để thực hiện việc này, thay đổi tuyên bố của bạn để:

public class MyConstants 
{ 
    private const string constant1 = "Hello World"; 
    public string Constant1 { get { return constant1; } } 
} 
+0

Để cho tiện để làm việc ở đó cần phải là một thể hiện của một lớp MyConstants có sẵn trong DataContext. – AnthonyWJones

+0

Có. Bạn phải có một cái gì đó, một nơi nào đó, bạn có thể có được một ví dụ.Bạn có thể triển khai thuộc tính này trực tiếp trong lớp ngữ cảnh dữ liệu của bạn và kéo liên tục từ đó. –

1

Nếu bạn không nhớ Visual Designer, tôi sẽ chỉ làm

public MyConstants 
{ 
    public static string Constant1 { get { return "Hello World"; } } 
} 

đây:

  1. tĩnh và getter chỉ làm cho nó const,
  2. và nó cũng là một tài sản để bạn có thể làm ràng buộc như thế này.

    <TextBlock Text="{Binding MyConstants.Constant1}" />

Tuy nhiên, như tôi đã nói, nó sẽ không phản ánh trên Visual Designer (XAML) trong Visual Studio, đó là lòng thương hại khá lớn :-)

+0

'MyConstants' là một lớp học? Cú pháp bạn có ở đây hiện không biên dịch. Làm thế nào để 'Binding' nhận ra rằng chữ" MyConstants "trong đường dẫn của nó thực sự ám chỉ một kiểu thay vì một thuộc tính của' DataContext' hiện tại? Nó cũng sẽ cần phải hiểu rằng "Constant1" đề cập đến tài sản tĩnh trên loại này chứ không phải là một tài sản dụ. Theo kinh nghiệm của tôi, điều này không hiệu quả. Bạn đang sử dụng phiên bản Silverlight nào? – AnthonyWJones