2011-12-12 21 views
23

Tôi ràng buộc một textbox cho một đối tượng, như vậy:Làm thế nào để sử dụng d: DesignInstance với các kiểu không có hàm tạo mặc định?

<TextBlock d:DataContext="{d:DesignInstance ViewModel:TaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    </TextBlock> 

Bây giờ tôi đang tự hỏi làm thế nào để làm cho nó hiển thị dữ liệu mô hình trong thiết kế. Tôi đã thử làm một điều gì đó như thế:

<TextBlock Text="{Binding Path=Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
    <d:DesignProperties.DataContext> 
     <ViewModel:TaskVM Title="Mock"/> 
    </d:DesignProperties.DataContext> 
    </TextBlock> 

Tuy nhiên, vì TaskVM không có ctor mặc định, tôi nhận được "Không có hàm tạo mặc định".

Tôi biết rằng khi tôi sử dụng d:DataContext="{d:DesignInstance ViewModel:TaskVM }", nó sẽ tạo loại dữ liệu giả. Có cách nào cho tôi để thiết lập các thuộc tính của loại giả này?

Cảm ơn!

Trả lời

37

Hàm khởi tạo mặc định là bắt buộc đối với loại được khởi tạo trong XAML. Để giải quyết sự cố, bạn có thể chỉ cần tạo một lớp con của TaskVM sẽ có trình thu thập mặc định và sử dụng nó làm bối cảnh dữ liệu thời gian thiết kế.

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM }" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 

Một lựa chọn khác là để thiết lập d:IsDesignTimeCreatable-False và một loại thay thế sẽ được tạo ra cho bạn trong thời gian chạy (sử dụng loại TaskVM của bạn như là một "hình dạng").

<TextBlock d:DataContext="{d:DesignInstance ViewModel:DesignTimeTaskVM, IsDesignTimeCreatable=False}" 
      Text="{Binding Title}" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"> 
</TextBlock> 
+0

Tôi thích ý tưởng đó :). Kế thừa sẽ cho phép tôi bỏ qua việc tạo lại tất cả các thuộc tính. Tôi vẫn thích có một cách tích hợp để thao tác đối tượng giả tạo mà WPF tạo ra. Nó DOES tạo ra một đối tượng giả, phải không? Nó nói trong tài liệu MSDN: d: IsDesignTimeCreatable Trong d: phần mở rộng đánh dấu DesignInstance, xác định rằng cá thể thiết kế được tạo ra từ kiểu của bạn, thay vì kiểu thay thế do nhà thiết kế tạo ra. – VitalyB

+0

@VitalyB - Có, bạn đã đúng.Có vẻ như bạn có thể đặt 'd: IsDesignTimeCreatable' thành' False' và một loại thay thế sẽ được tạo cho bạn trong thời gian chạy (sử dụng loại TaskVM của bạn làm "hình dạng"). –

+1

Chính xác. Đó là khá khó khăn mà tôi không thể thiết lập các thuộc tính của loại thay thế. – VitalyB

3

Bạn có thể thêm hàm tạo mặc định vào máy ảo của mình. Sau đó nó có thể kiểm tra xem nó có đang trong thời gian thiết kế hay không và thiết lập các giá trị thời gian thiết kế thích hợp cho các thuộc tính của nó.

+12

Một tùy chọn khác là tạo một hàm khởi tạo mặc định và đánh dấu nó bằng '[Lỗi thời (" chỉ sử dụng cho chế độ thiết kế ", Đúng)]' để tăng lỗi biên dịch nếu bạn cố gắng sử dụng nó. – DonkeyMaster

+0

Liên kết đã chết. Đề cập đến câu hỏi này thay vào đó: https://stackoverflow.com/q/834283/200443 – Maxence

2

Một giải pháp thay thế khác là sử dụng một lớp tĩnh để giữ mô hình khung nhìn và gọi lớp đó từ XAML. Dưới đây là một ví dụ:

Các XAML sử dụng một nhà máy xem mô hình để tạo ra bối cảnh dữ liệu thiết kế:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
mc:Ignorable="d" 
d:DataContext="{x:Static local:ViewModelFactory.ViewModel}" 


Các ViewModelFactory tĩnh xây dựng các mô hình điểm trong xây dựng và lưu trữ nó trong một tài sản công cộng nơi nó có thể được truy cập từ bên ngoài (từ XAML):

public static class ViewModelFactory 
{ 
    /// <summary> 
    /// Static constructor. 
    /// </summary> 
    static ViewModelFactory() 
    { 
     ViewModel = new TypeOfViewModel(null); 

     // further configuration of ViewModel 
    } 

    public static TypeOfViewModel ViewModel 
    { 
     get; set; 
    } 
} 



Xin lưu ý t mũ lớp TypeOfViewModel không có hàm tạo tham số. Vì vậy, ViewModelFactory phải vượt qua một số giá trị, trong trường hợp này là null.

Vì vậy, trong trường hợp này, lớp TypeOfViewModel sẽ cần phải được triển khai theo cách nhận thức được rằng trong thời gian thiết kế, phụ thuộc được truyền là không có giá trị.

public class TypeOfViewModel 
{ 
    /// <summary> 
    /// Constructor. 
    /// </summary> 
    /// <param name="dependency">May be null at design time</param> 
    public TypeOfViewModel(SomeDependentClass dependency) 
    { 

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