2012-05-24 46 views
5

Cung cấp dữ liệu thời gian thiết kế cho DataContext dễ dàng với việc sử dụng d:DataContext nhưng điều gì về thuộc tính điều khiển được tham chiếu với {TemplateBinding} hoặc {RelativeSource TemplatedParent} từ Style.Template?Dữ liệu thời gian thiết kế cho ControlTemplate

Tôi có nên chỉ kiểm soát dữ liệu mẫu bên trong hàm dựng/Sự kiện được tải khi DesignerProperties.GetIsInDesignMode(this) trả về true? (Không thể làm điều này vì nó sẽ phá vỡ trải nghiệm thiết kế thông thường).

Điều gì về kiểm soát của bên thứ ba mà tôi không thể sửa đổi?

Trả lời

2

Đối với điều khiển riêng của tôi, tôi thường làm một cái gì đó như:

<Style x:Key="FooStyle> 
    <Setter Property="Template> 
    <Setter.Value> 
     <ControlTemplate TargetType="FooControl"> 
     <Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}"> 
      ... guts of control template go here ... 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

đâu "FooDesignTimeData" là một lớp cung cấp dữ liệu thời gian thiết kế theo hình thức thích hợp (thực hiện giao diện từ mô hình xem thời gian chạy của bạn là một thực hành tốt đây).

Tôi không hiểu tại sao điều này cũng không hoạt động đối với kiểm soát của bên thứ 3. Thậm chí bạn có thể không cần phải kiểm tra lại - bạn có thể thoát khỏi bằng cách chỉ định điều khiển bên thứ 3 bên trong phong cách của bạn và cho nó ngữ cảnh dữ liệu thời gian thiết kế như đã nêu ở trên, nhưng tôi chưa thử kịch bản đó. Tôi cho rằng bạn sẽ gặp rắc rối này bởi vì bạn buộc phải sử dụng một điều khiển không có kinh nghiệm thiết kế tuyệt vời (chẳng hạn như cung cấp một Vendor.Controls.Design.dll hoặc Vendor.Controls.Expression.Design. tập tin dll).

Để làm việc với TemplateBindings, tôi không có giải pháp tuyệt vời. Thông thường tôi tạo một trang thử nghiệm hiển thị điều khiển của tôi và cho phép tôi chuyển đổi các mẫu xung quanh. Trong quá trình tích hợp, bạn sẽ có chế độ xem bổ sung (trong ứng dụng của bạn hoặc dưới dạng ứng dụng riêng) cho phép bạn tạo và điều khiển các phiên bản của điều khiển nếu cần. Hành động kích hoạt được nhắm mục tiêu GoToStateAction từ Blend SDK thường hữu ích ở đây. Ví dụ: tạo một nút cho mỗi trạng thái trực quan và sau đó sử dụng Nhấp chuột ngay cả để kích hoạt chuyển đổi sang một trạng thái cụ thể. Vì vậy, bạn có thể dễ dàng kiểm tra tất cả các trạng thái của bạn cộng với chuyển tiếp trong khi bị ràng buộc để kiểm tra dữ liệu. Hacky và không thực sự thiết kế dữ liệu thời gian, nhưng nó hoạt động.

+0

Như tôi đã nói '{Binding}' rất dễ dàng do 'd: DataContext' nhưng tôi sau' {TemplateBinding} 's. –

+0

Bạn đã thử làm như trên, nhưng gán d: DataContext như một phần của phong cách? Tôi không có một giải pháp tuyệt vời cho tình huống này: thường tôi tạo một trang thử nghiệm hiển thị điều khiển của tôi và cho phép tôi chuyển đổi các mẫu xung quanh. Hacky, nhưng nó hoạt động. –

+0

Điều này có vẻ hợp lý. Phải tự mình thử. Nhưng bạn phải thay đổi XAML cho một phiên bản tích hợp, hoặc bạn có thể cung cấp Binding ở đó không? –

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