2009-11-27 36 views
20

Gần đây tôi đang cố gắng sử dụng lại một số yếu tố giao diện người dùng trong ứng dụng của mình. Khi tôi bắt đầu lập trình với WPF, tôi đã nói rằng DataTemplate là cách tốt nhất để sử dụng lại các phần tử giao diện người dùng. Bạn có thể xác định mẫu cho thực thể dữ liệu của mình và sử dụng nó ở mọi nơi. Nghe có vẻ rất hay. Tuy nhiên, tôi cũng tìm thấy một số nhược điểm, đặc biệt là khi nó được so sánh với UserControl.WPF, UserControl hoặc DataTemplate

  1. Bạn không thể sử dụng lại DataTemplate được xác định trong Cửa sổ hoặc UserControl khác. Ví dụ, nếu UserDataTemplate được định nghĩa trong WindowA.xaml, bạn không thể sử dụng nó trong WindowB.xaml. Giải pháp có thể là đặt DataTemplate làm tài nguyên trong Từ điển tài nguyên toàn cầu.
  2. DataTemplate khó có một số mã phía sau. Như đã đề cập trong mục 1, nếu bạn đặt DataTemplate trong một ResourceDictionary, không có chỗ để đặt mã của bạn theo mặc định. Tôi googled vấn đề và có, tôi tìm thấy một thủ thuật để làm cho ResourceDictionary có một tập tin cs. Nhưng nó vẫn còn một vấn đề khác.
  3. Một vấn đề khác của DataTemplate là bạn phải rõ ràng với sự khác biệt giữa cá thể của DataTemplate và các thể hiện của nội dung của DataTemplate. Một DataTemplate sẽ chỉ có một "thể hiện của DataTemplate", và có thể có nhiều trường hợp nội dung của DataTemplate. Hãy để tôi giải thích nó với một Ví dụ:

    <DataTemplate> 
         <DataTemplate.Resources> 
           <my:User x:key="User1"/> 
         </DataTemplate.Resources>     
         <Grid MouseLeftButtonDown="OnMouseLeftButtonDown"> 
           <Grid.Resources> 
             <my:User x:key="User2"/> 
           </Grid.Resources> 
         </Grid>   
    </DataTemplate> 
    
    
    public partial class CodeBehind 
    { 
         Point mousePos = new Point(); 
    
         private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
         { 
           mousePos = e.Pos...; 
         } 
    } 
    

Kết quả sẽ là: User1 sẽ chỉ có một trường hợp, tuy nhiên, một trường hợp User2 sẽ được tạo ra khi các DataTemplate được áp dụng, có nghĩa là User2 sẽ có nhiều trường hợp nếu datatemplate đang được áp dụng nhiều lần. Tuy nhiên, không giống như UserControl, trường "mousePos" sẽ KHÔNG có nhiều bản sao. Nếu DataTemplate đang được áp dụng 100 lần, mousePos sẽ không có 100 bản sao, có nghĩa là 100 Lưới sẽ chỉ sử dụng trường mousePos duy nhất cùng một lúc, điều này có thể gây ra sự cố. Trong UserControl, trường bạn đã xác định sẽ chỉ được sử dụng bởi điều khiển. 100 phiên bản UserControl sẽ có 100 bản sao trường.

Có lẽ tôi đang sử dụng DataTemplate theo cách sai. Mọi bình luận đều được đánh giá cao.

Trân trọng,

Zach

Trả lời

25

DataTemplates và UserControl khái niệm giải quyết hai vấn đề khác nhau. Họ không thực sự hoán đổi cho nhau nên so sánh của bạn không thực sự chính xác.

DataTemplates là tất cả về cách áp dụng kiểu trực quan cho một DataType. Thông thường điều này có nghĩa là tôi có lớp .NET của riêng tôi gọi là Foo và tôi muốn cung cấp cho nó một phong cách trực quan. Tôi sẽ làm điều này bằng cách tạo ra một DataTemplate với một DataType của Foo.

Sau đó tôi có thể đặt DataTemplate này vào ứng dụng của mình (nói trong App.XAML) và tôi sẽ áp dụng kiểu trực quan cho đối tượng dữ liệu của mình Foo ở bất kỳ nơi nào được sử dụng. Thường thì điều này có nghĩa là bạn sẽ thấy một ContentControl có thuộc tính Nội dung được liên kết với thuộc tính của kiểu Foo.

UserControls khác có tất cả về tổ chức XAML. Một điều khiển người dùng giúp tổ chức các khối XAML mà bạn muốn sử dụng lại trong suốt ứng dụng của bạn có các hành vi và chức năng gắn liền với nó. Đây là nhiều hơn một DataTempate sẽ làm gì.

Một DataTemplate được gắn với một DataType và hiển thị hình ảnh cho loại đó. Một UserControl có thể bao gồm nhiều DataTypes và có thể bao gồm các hành vi tùy chỉnh.

Điều đó đang được nói, tôi rất hiếm khi tìm thấy nhu cầu cho UserControl. Tôi sử dụng DataTemplates trên tất cả các mô hình dữ liệu của tôi và thực hiện các hành vi của tôi mặc dù ràng buộc dữ liệu và mô hình MVVM.

2

Về 2.

Tôi muốn nói rằng DataTemplates không được thiết kế để được sử dụng với code-behind. Bạn có thể hầu hết các trường hợp chỉ sử dụng DataBinding và lệnh để dây logic giữa mô hình của bạn và biểu diễn của nó. Không có mã-đằng sau cũng tạo điều kiện cho các bài kiểm tra đơn vị của bạn ứng dụng.

10

Cá nhân, tôi tạo UserControl rồi tạo DataTemplate từ đó. Điều này có lợi thế sau đây, với tôi:

  1. Có thể sử dụng trên các cửa sổ, chỉ bằng cách xác định lại phần DataTemplate.
  2. Có thể sử dụng mã-đằng sau (tôi biết, tôi biết, nhưng một số thứ dễ dàng hơn rất nhiều khi sử dụng mã-đằng sau, tôi không thấy điểm không cần thiết làm phức tạp mã của tôi dựa trên giáo điều).
  3. hỗ trợ thiết kế XAML.
Các vấn đề liên quan