tôi có phần mở rộng đánh dấu nàyXác định DataTemplate.DataType với một kiểu tùy chỉnh mở rộng
public class NullableExtension : TypeExtension
{
public NullableExtension() {
}
public NullableExtension(string type)
: base(type) {
}
public NullableExtension(Type type)
: base(type) {
}
public override object ProvideValue(IServiceProvider serviceProvider) {
Type basis = (Type)base.ProvideValue(serviceProvider);
return typeof(Nullable<>).MakeGenericType(basis);
}
}
được thiết kế để cung cấp một phiên bản nullable của một số loại khác. Nó hoạt động như mong đợi khi được sử dụng trong XAML "bình thường". Ví dụ: như trong
<SomeControl DataContext="{My:Nullable System:Int32}"/>
(giả định rằng My là không gian tên XML được định nghĩa cho không gian tên C# đang giữ phần mở rộng và tương tự cho Hệ thống). Ngữ cảnh dữ liệu cho điều khiển được đặt thành System.Type
cho Nullable<int>
như tôi mong đợi.
Tuy nhiên, khi tôi sử dụng phần mở rộng này để thử và thiết lập các DataType
tài sản của một DataTemplate
như
<DataTemplate DataType="{My:Nullable System:Int32}">
<TextBlock ... />
</DataTemplate>
tôi đã nói, bởi trình biên dịch, mà
Một chìa khóa cho một cuốn từ điển không thể thuộc loại 'System.Windows.Controls.Primitives.TextBlock'. Chỉ String, TypeExtension, và StaticExtension được hỗ trợ. "
và
" Không constructor cho loại 'NullableExtension' có 1 tham số.
Có ai biết tại sao chỉ ba phương thức đó (và thậm chí không phải lớp con của TypeExtension
, như của tôi) được phép không? Điều gì là đặc biệt về việc xử lý XAML tại thời điểm đó? Và có cách nào khác để thực hiện điều này (lựa chọn mẫu dữ liệu dựa trên các loại có thể rỗng) mà không cần sử dụng đến một số DataTemplateSelector
?
Cảm ơn. Tôi nhận ra nó có thể nguy hiểm nhưng tôi nghĩ rằng nó sẽ có thể xác nhận loại giá trị được gán cho DataType, trên thực tế, một System.Type. Tôi không cố gắng gán bất kỳ giá trị tùy ý nào cho DataType, chỉ là một Loại. Thú vị về trình phân tích cú pháp BAML. Đối với vấn đề boxing, đó là một điểm tốt, mặc dù trong trường hợp tôi đã có tôi sẽ cung cấp một cách rõ ràng Nullable thay vì một giá trị đóng hộp và có giàn giáo khác tại chỗ để làm cho rằng "làm điều đúng" cho nhu cầu của tôi. Có vẻ như tôi sẽ phải tiếp tục giải quyết sự cố. Cảm ơn đã giúp đỡ. –
Rất tiếc, tôi luôn quên rằng các nhận xét không giữ thêm dòng mới tại đây. Xin lỗi ở trên là định dạng quá icky. –
Mọi thứ rõ ràng đã thay đổi kể từ khi nó được viết, và trong khi nó trông giống như 'DataType =" {x: Type TypeName = System: Nullable \ '1 [[System.Int32]]}" 'sẽ hoạt động, vào tháng 8 năm 2013, dưới. NET 4.0, nó không. Cách duy nhất tôi tìm thấy để giải quyết vấn đề này là sử dụng một số loại MarkupExtension. – Dan