2009-07-17 18 views
5

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ả contentControlmyContentControl.

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ụ:

  1. Tạo MyContentControl:

    public class MyContentControl : ContentControl 
    { 
        static MyContentControl() 
        { 
        DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl), 
                 new FrameworkPropertyMetadata(typeof (MyContentControl))); 
        } 
        public MyContentControl() {} 
    } 
    
  2. Tạo MyTemplateSelector:

    public class MyTemplateSelector : DataTemplateSelector 
    { 
        public override DataTemplate SelectTemplate(object item, DependencyObject container) 
        { 
        return null; // <== Place the breakpoint here 
        } 
    } 
    
  3. Thêm ContentControlMyContent 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> 
    
  4. Thêm mã này ở đâu đó sau InitializeComponent (hoặc trong Loaded 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"contentControl phần tử.

Trả lời

0

Bạn có thể cần phải đăng thêm mã của mình, bởi vì tôi vừa tạo một ví dụ đơn giản và nó hoạt động tốt. My DataTemplate chỉ chứa một số TextBox, DataTemplateSelector của tôi luôn trả về DataTemplate và cả một số ContentControl và một lớp bắt nguồn từ ContentControl sử dụng DataTemplateSelector của tôi. Trong cả hai trường hợp, TextBox được hiển thị.

2

Tôi gặp vấn đề tương tự trước đây và tôi giải quyết vấn đề này với gợi ý này (Notify DataTemplateSelector about the change).

Vấn đề của tôi là, tôi muốn một ContentPresenter thay đổi UserControl được nhúng khi lựa chọn ComboBox thay đổi.

Các Combobox + ContentPresenter XAML là

 <ComboBox Name="comboBoxControl" Grid.Row="1" Grid.Column="1" SelectionChanged="comboBox_SelectionChanged"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <cmd:EventToCommand Command="{Binding Path=ChangeControlCommand, Mode=OneWay}" CommandParameter="{Binding Path=SelectedItem.Content, ElementName=comboBoxControlType}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <ComboBoxItem>UserControl-1-</ComboBoxItem> 
     <ComboBoxItem>UserControl-2-</ComboBoxItem> 
    </ComboBox> 
<ContentPresenter Name="contentPresenter" ContentTemplateSelector="{Binding Source={StaticResource controlCueTemplateSelector}}" 
         Content="{Binding}" /> 

Như bạn thấy, lệnh ràng buộc với MVVM cách là cách tiếp cận của tôi. Mặc dù bạn có thể không muốn viết mã-đằng sau, vui lòng viết mã sau với sự kiện thích hợp như dưới đây.

private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var content = contentPresenter.Content; 
     contentPresenter.ClearValue(ContentPresenter.ContentProperty); 
     contentPresenter.SetValue(ContentPresenter.ContentProperty, content); 
    } 

Bottomline là, bạn cần phải đặt lại đối tượng mục tiêu được ràng buộc (trong trường hợp của tôi là thuộc tính Nội dung).

2

Tôi chỉ có cùng một vấn đề và lý do DataTemplateSelector đã được áp dụng cho một ContentControl nhưng không cho kiểm soát xuất phát của tôi đã được ẩn trong ControlTemplate cho điều khiển dẫn xuất của tôi. Tôi chỉ đơn giản là quên để thêm mẫu ràng buộc cho ContentTemplateSelector:

<ControlTemplate TargetType="{x:Type local:UniControl}"> 
<Border Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}"> 
    <ContentPresenter Content="{TemplateBinding Content}" 
         ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"/> 
</Border> 

Hope this helps.

+0

Cảm ơn. Điều đó đã giúp tôi tiết kiệm một số tiền. – dotNET

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