WPF、UserControl、DataTemplate 質問する

WPF、UserControl、DataTemplate 質問する

最近、アプリケーションでいくつかの UI 要素を再利用しようとしています。WPF でプログラミングを始めたとき、UI 要素を再利用するには DataTemplate が最適な方法だと聞きました。データ エンティティのテンプレートを定義して、どこでも使用できます。とても良さそうです。しかし、UserControl と比較すると、特に欠点もいくつか見つかりました。

  1. 別のウィンドウまたはユーザー コントロールで定義された DataTemplate を再利用することはできません。たとえば、UserDataTemplate が WindowA.xaml で定義されている場合、WindowB.xaml で使用することはできません。解決策としては、DataTemplate をグローバル リソース ディクショナリのリソースとして配置することが考えられます。
  2. DataTemplate にコードを配置するのは困難です。項目 1 で述べたように、DataTemplate を ResourceDictionary に配置すると、デフォルトではコードを配置する場所がありません。この問題を Google で検索したところ、ResourceDictionary に cs ファイルを配置する方法が見つかりました。しかし、まだ別の問題があります。
  3. DataTemplate のもう 1 つの問題は、DataTemplate 自体のインスタンスと DataTemplate のコンテンツのインスタンスの違いを明確にする必要があることです。DataTemplate には「DataTemplate のインスタンス」が 1 つだけありますが、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...;
            }
    }
    

結果は次のようになります: User1 にはインスタンスが 1 つだけありますが、DataTemplate が適用されると User2 インスタンスが作成されます。つまり、データテンプレートが何度も適用される場合、User2 には多くのインスタンスがあることになります。ただし、UserControl とは異なり、フィールド "mousePos" には多くのコピーはありません。DataTemplate が 100 回適用された場合、mousePos には 100 のコピーはありません。つまり、100 個のグリッドが同時に 1 つの mousePos フィールドのみを使用することになり、問題が発生する可能性があります。UserControl では、定義したフィールドはコントロールによってのみ使用されます。100 個の UserControl インスタンスには 100 個のフィールド コピーがあります。

おそらく、私は DataTemplate を間違った方法で使用しているのでしょう。コメントをいただければ幸いです。

よろしくお願いします、

ザック

ベストアンサー1

概念的には、DataTemplates と UserControls は 2 つの異なる問題を解決します。これらは実際には互換性がないため、比較は正確ではありません。

DataTemplates は、DataType にビジュアル スタイルを適用することが目的です。通常、これは、Foo という独自の .NET クラスがあり、これにビジュアル スタイルを適用したいということを意味します。これを行うには、Foo の DataType を持つ DataTemplate を作成します。

次に、この DataTemplate をアプリケーション (たとえば App.XAML) に配置すると、データ オブジェクト Foo が使用される場所にビジュアル スタイルが適用されます。多くの場合、これは、Foo 型のプロパティにバインドされた Content プロパティを持つ ContentControl が表示されることを意味します。

一方、UserControls は XAML の編成に特化しています。ユーザー コントロールは、動作と機能が関連付けられているアプリケーション全体で再利用する XAML のチャンクを編成するのに役立ちます。これは、DataTempate が行うこと以上のものです。

DataTemplate は 1 つの DataType に関連付けられ、そのタイプのビジュアルを表示します。UserControl は複数の DataType で構成でき、カスタム動作を含めることができます。

そうは言っても、UserControl が必要になることはほとんどありません。私は、データ バインディングと MVVM パターンを使用してデータをモデル化し、動作を実装するために、あらゆる場面で DataTemplates を使用しています。

おすすめ記事