最近我試圖在我的應用程序中重用一些UI元素。當我開始使用WPF編程時,我被告知DataTemplate是重用UI元素的最佳方式。您可以爲您的數據實體定義一個模板,並在任何地方使用它。聽起來很不錯。 但是,我還發現一些缺點,尤其是與UserControl進行比較時。WPF,UserControl或DataTemplate
- 您不能重用在另一個Window或UserControl中定義的DataTemplate。例如,如果UserDataTemplate在WindowA.xaml中定義,則不能在WindowB.xaml中使用它。解決方案可能是將DataTemplate作爲全局資源字典中的資源。
- DataTemplate很難有一些代碼。如第1項所述,如果將DataTemplate放入ResourceDictionary中,則默認情況下沒有地方放置代碼。我GOOGLE了這個問題,是的,我發現一個技巧,使ResourceDictionary有一個cs文件。但它仍然有另一個問題。
DataTemplate中的另一個問題是,你必須與DataTemplate中自身的實例和DataTemplate中的內容的實例之間的差別清晰。一個DataTemplate將只有一個「DataTemplate實例」,並且可能有許多DataTemplate內容的實例。讓我舉個例子來說吧:
<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...; } }
的結果將是:用戶1只會有一個實例,但是,用戶2實例將一旦施加的DataTemplate,這意味着用戶2將創建很多情況下,如果多次應用數據模板。 但是,與UserControl不同,「mousePos」字段不會有多個副本。如果DataTemplate應用了100次,mousePos將不會有100個副本,這意味着100個網格將同時使用唯一的一個mousePos字段,這可能會導致問題。 在UserControl中,您定義的字段只能由控件使用。 100個UserControl實例將有100個字段副本。
也許我在錯誤的道路使用的DataTemplate。任何意見表示讚賞。
最好的問候,
扎克