2009-12-03 27 views
23

Tôi đang sử dụng WPF với mẫu Model-View-ViewModel. Do đó, mã của tôi phía sau các tệp (.xaml.cs) đều trống, ngoại trừ hàm tạo với một lệnh gọi tới InitializeComponent. Do đó, đối với mọi tệp .xaml, tôi có một tệp .xaml.cs phù hợp, vô ích.XAML không có mã .xaml.cs phía sau các tệp

Tôi thề là tôi đã đọc ở đâu đó rằng nếu mã phía sau tệp trống, ngoại trừ hàm tạo, có cách xóa hoàn toàn tệp khỏi dự án. Sau khi tìm kiếm trên net, có vẻ như rằng cách thích hợp để làm điều này là sử dụng 'x: Subclass' thuộc tính:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
    x:Class="MyNamespace.MyClass" 
    x:Subclass="UserControl" 
    d:DesignWidth="700" d:DesignHeight="500"> 

này nào sau đây trong tập tin được tạo .g.cs:

  1. Xoá bộ sửa đổi lớp 'một phần' trên MyClass.
  2. Thêm lớp 'UserControl' vào danh sách lớp con của nó.

Có vẻ hoàn hảo. Thật vậy, nếu bạn vẫn có tệp .xaml.cs trong bản dựng, nó không còn biên dịch vì phần thiếu - vì vậy tôi nghĩ điều này phải đúng. Tuy nhiên, nếu tôi loại bỏ các tập tin thừa từ xây dựng và chạy, kiểm soát không được khởi tạo một cách chính xác (nó là trống). Đây là, tôi đoán, bởi vì InitializeComponent() không được gọi. Tôi thấy InitializeComponent không phải là ảo, do đó, có vẻ như sẽ không có cách nào để lớp cơ sở gọi nó (thiếu sử dụng sự phản chiếu).

Tôi có thiếu gì đó không?

Cảm ơn!

Eric

Trả lời

13

Nếu bạn theo dõi Josh Smith's MVVM article, anh ấy sử dụng DataTemplates cho Chế độ xem thay vì kiểm soát của người dùng. Nếu bạn đặt DataTemplates của bạn vào ResourceDictionaries, họ không có một code-behind cả. Nếu bạn không sử dụng mã phía sau điều khiển người dùng của mình, điều đó có nghĩa là bạn có thể sử dụng phương pháp DataTemplate không?Nếu bạn làm điều đó, WPF sẽ chăm sóc ràng buộc View của bạn với ViewModel của bạn cho bạn.

+0

Cảm ơn Scott. Đây chắc chắn là một cách tiếp cận tốt hơn. – Eric

+0

+1 Tôi cũng sử dụng cách này. Nó hoạt động rất tuyệt, nó gần giống như ma thuật. –

+1

Lưu ý: có sẵn trong WPF, nhưng không có trong Silverlight. – MrSharps

2

tôi đã có một cuộc thảo luận với một thành viên trong nhóm Windows Client tại PDC về điều này, và ngay bây giờ, được cho biết rằng không có cách nào hỗ trợ chính thức để loại bỏ hoàn toàn các mã đằng sau tập tin. Như bạn có thể thấy, bạn có thể làm cho nó để biên dịch, nhưng InitializeComponent() không bao giờ được gọi, do đó, điều khiển không nhận được thiết lập đúng cách.

Cách sử dụng x:Subclass attribute "chủ yếu dành cho các ngôn ngữ không hỗ trợ khai báo từng phần." Nó không có ý định cho phép hành vi này (không may).

31

Là một lựa chọn khác, nếu bạn không muốn đi tất cả các cách để sử dụng DataTemplates, đây là một cách tiếp cận thay thế cho UserControls:

Sử dụng x: thuộc tính Mã nhúng cuộc gọi constructor trong XAML:

<x:Code><![CDATA[ public MyClass() { InitializeComponent(); }]]></x:Code> 

Eric

+2

Đó là giải pháp rất bóng bẩy. –

+0

ngọt. ai đã nghĩ về điều đó? –

+3

cũng ... Tôi upvote này, vì nó rất thông minh, nhưng có một cái gì đó mà chỉ không cảm thấy đúng về việc có loại mã CDATA trong tập tin XAML của bạn ... Giống như một người khác hỏi trong một chủ đề tương tự, tại sao chúng ta muốn trải qua những rắc rối trong việc xóa bỏ các tập tin mã trống ở đằng sau? họ không bận tâm, người ta khó có thể thấy họ ngồi đó. Tuy nhiên, tôi thích sự sáng tạo của bạn :-) –

0

Ra khỏi tò mò tuyệt, bạn đã cố gắng sử dụng này:

x:Subclass="Control" 

Theo mặc định, UserControls yêu cầu lệnh InitializeComponent(), nhưng điều khiển tiêu chuẩn defacto thì không. Tôi muốn được quan tâm để xem nếu điều này hoạt động.

-Doug

+0

Chỉ cần thử điều này. Nó không thay đổi hành vi. Không có lệnh gọi đến InitializeComponent(), điều khiển sẽ trống. – Eric

1

Nếu bạn đang sử dụng vi mô caliburn, bạn có thể loại bỏ .xaml.cs một cách hiệu quả, khung công tác sẽ đảm bảo khởi tạo (tức là nếu bạn đang sử dụng phương pháp tiếp cận kiểu xem).

Điều này được thảo luận https://caliburnmicro.codeplex.com/discussions/444250

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