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
- 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.
- 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.
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