Tôi đang cố gắng tạo một điều khiển được kiểm soát ContentControl
(hãy gọi nó là MyContentControl
) sẽ được đặt ControlTemplate
bằng một phiên bản loại DataTemplateSelector
-được nhập trước (hãy gọi nó MyTemplateSelector
).WPF DataTemplateSelector.SelectTemplate không được gọi cho kiểu bắt nguồn ContentControl
Khi tôi cố gắng này:
ContentControl contentControl = new ContentControl();
contentControl.ContentTemplateSelector = new MyTemplateSelector();
contentControl.Content = "Some ContentControl Content";
MyContentControl myContentControl = new MyContentControl();
myContentControl.ContentTemplateSelector = new MyTemplateSelector();
myContentControl.Content = "Some MyControl Content";
Tôi hy vọng rằng, khi tôi đặt nội dung trên các điều khiển, MyTemplateSelector
override 's của DataTemplateSelector.SelectTemplate()
phương pháp được gọi cho cả contentControl
và myContentControl
.
Thực tế, nó chỉ được gọi cho contentControl. Tôi cần phải làm gì (và tại sao!) Để làm cho nó hoạt động cho myContentControl
?
(Không chắc chắn nếu nó có liên quan, nhưng đối với thời điểm hiện tại MyContentControl
không làm bất cứ điều gì với DependencyProperties
khác hơn trọng thông tin siêu dữ liệu cho DefaultStyleKeyProperty
EDIT (chuyển nội dung từ bài khác cho câu hỏi ban đầu):.
Dưới đây là một chút xây dựng hơn ví dụ:
Tạo MyContentControl:
public class MyContentControl : ContentControl { static MyContentControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl), new FrameworkPropertyMetadata(typeof (MyContentControl))); } public MyContentControl() {} }
Tạo
MyTemplateSelector
:public class MyTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { return null; // <== Place the breakpoint here } }
Thêm
ContentControl
vàMyContent
kiểm soát cửa sổ chính của bạn (ví dụ):<StackPanel> <local:MyContentControl x:Name="myContentControl" /> <ContentControl x:Name="contentControl" /> </StackPanel>
Thêm mã này ở đâu đó sau
InitializeComponent
(hoặc trongLoaded
xử lý):myContentControl.ContentTemplateSelector = new MyTemplateSelector(); myContentControl.Content = "123"; contentControl.ContentTemplateSelector = new MyTemplateSelector(); contentControl.Content = "ABC";
Các breakpoint đề cập trong bước (2) bị trúng một lần duy nhất, cho content="ABC"
và contentControl
phần tử.
Cảm ơn. Điều đó đã giúp tôi tiết kiệm một số tiền. – dotNET