2010-05-01 30 views
5

Tôi có một điều khiển tùy chỉnh có một ContentPresenter sẽ có một đối tượng tùy ý được đặt làm nội dung. Đối tượng này không có bất kỳ ràng buộc nào về kiểu của nó, vì vậy tôi muốn điều khiển này hiển thị nội dung của nó dựa trên bất kỳ mẫu dữ liệu nào được xác định bởi ứng dụng hoặc bởi các mẫu dữ liệu được định nghĩa trong Generic.xaml. Nếu trong một ứng dụng tôi định nghĩa một số mẫu dữ liệu (không có khóa vì tôi muốn nó được áp dụng tự động cho các đối tượng thuộc loại đó) và tôi sử dụng điều khiển tùy chỉnh được ràng buộc với một đối tượng thuộc loại đó, mẫu dữ liệu được áp dụng tự động. Nhưng tôi có một số mẫu dữ liệu được xác định cho một số loại trong generic.xaml nơi tôi xác định kiểu điều khiển tùy chỉnh và các mẫu này không được áp dụng tự động. Đây là generic.xaml:Làm cách nào để các mẫu dữ liệu trong generic.xaml được áp dụng tự động?

< DataTemplate DataType = "{x: Loại PredefinedType > < - Mẫu nghĩa - > <DataTemplate>

< Phong cách TargetType =" {x: Loại CustomControl}" > < - phong cách kiểm soát - > </phong cách >

Nếu tôi đặt một đối tượng kiểu 'PredefinedType' làm nội dung trong contentpresenter, mẫu dữ liệu không được áp dụng. Tuy nhiên, nếu nó hoạt động nếu tôi xác định mẫu dữ liệu trong app.xaml cho ứng dụng đó bằng cách sử dụng điều khiển tùy chỉnh.

Có ai đó có đầu mối không? Tôi thực sự không thể giả định rằng người dùng của điều khiển sẽ xác định mẫu dữ liệu này, vì vậy tôi cần một số cách để kết hợp nó với điều khiển tùy chỉnh.

Trả lời

4

Tài nguyên được khai báo trong Generic.xaml chỉ được kéo vào nếu chúng được tham chiếu trực tiếp bởi mẫu được áp dụng cho điều khiển (thường là bởi tham chiếu StaticResource). Trong trường hợp này, bạn không thể thiết lập một tham chiếu trực tiếp, do đó bạn cần sử dụng một phương thức khác để đóng gói DataTemplates bằng ControlTemplate của bạn. Bạn có thể làm điều này bằng cách bao gồm chúng trong một bộ sưu tập tài nguyên địa phương hơn, như ControlTemplate.Resources:

<Style TargetType="{x:Type local:MyControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MyControl}"> 
       <ControlTemplate.Resources> 
        <DataTemplate DataType="{x:Type local:MyDataObject}"> 
         <TextBlock Text="{Binding Name}"/> 
        </DataTemplate> 
       </ControlTemplate.Resources> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 
         Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}"> 
        <ContentPresenter/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Làm việc độc đáo, nhờ :) –

+0

Ngoài câu trả lời đúng của John, nếu bạn cần phải sử dụng các mẫu khác bạn có thể mang chúng vào tài nguyên mẫu điều khiển được hợp nhất từ ​​điển từ một tệp XAML khác. Điều này cho phép bạn sử dụng lại các mẫu trong cả hai tệp generic.xaml và các vị trí khác. –

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