2009-08-24 17 views
6

再利用可能なWPFウィンドウは、さまざまなタイプに適しています。T. デザイナーとコードビハインドファイルがあります。WPF汎用ウィンドウ

私はこのようなことをすることができますか?

/* Code behind file */ 
public partial class MyWindows<T> : Window 
{} 

答えて

3

残念ながら、何が欲しいのはかなりことはできません。

更新: .NET 4.0以前(この回答が最初に書かれた時)、XAML support for consuming generic types was very limited;例えばジェネリックスはルート要素だけで動作しました。 .NET 4.0では、いくつかの制限が解除されました。

.NET 4.0では、完全に特殊化されたジェネリック型を構築できます。したがって、XAML自体にはジェネリックタイプの概念がまだありませんが、はジェネリックタイプの特殊化を指します。 (類推により、XAMLは、List<>の概念を表現することはできませんが、List<int>という概念を表すことができます)。詳細については、MSDN page "Generics in XAML"をご覧ください。

x:TypeArguments Directiveで特殊ジェネリックタイプのインスタンスを作成できます。例えば、System名前空間、およびSystem.Collections.Genericからscg、その後、myにバインドされた独自のMyWindows'名前空間へのXAMLの名前空間にバインドxsysと:

  • <my:MyWindows x:TypeArguments="x:String">MyWindows<string>インスタンスを構築します。
  • <scg:List x:TypeArguments="sys:Tuple(sys:String,sys:Int32)">は、ジェネリック型を使用してList<Tuple<string,int>>

はもはやので、XAMLで問題となって構築しないだろう!

よろしくお願いします。をXAMLに定義してください。それは可能ではありません。ここには2つの回避策があります。まず、(そして別の質問に対するあなたのコメントに基づいて、これがあなたの望むものだと思う)単純なパラメータとして型を単純に渡すことができます。これを行うと、ジェネリックが提供するすべてのコンパイル時の安全機能が失われますが、多くの場合、それらは関係のないものです。第2に、XAMLでコードビハインドを持つ通常の非ジェネリッククラスを定義し、単純にコードの再利用にジェネリックベースクラスを使用できます。そうすれば、少なくとも適切なジェネリック医薬品の安全性と再利用性を得ることができます。

+3

あなたが言うとき、あなたは間違っている、それを "XAMLを、例えば、全くジェネリックをサポートしていません" x:TypeArguments経由で、http://blogs.windowsclient.net/rob_relyea/archive/2009/06/01/xaml-using-generic-types-in-xaml-2009.aspx – Grokodile

+0

...を参照してください。それが変わった! http://msdn.microsoft.com/en-us/library/ee956431%28v=vs.110%29.aspx私は答えを更新します:-)。 –

+0

@EamonNerbonne申し訳ありませんが、私はジェネリックXAMLの制限について学びました。私は自分自身のコンテナコントロールをロールバックしていたときに、子コントロールが集約される汎用引数を取ったときに昨日この問題に遭遇しました。私はXAMLでコンテナコントロールを定義できませんでした。本質的にNunoがhttp://social.msdnを求めていること。microsoft.com/Forums/vstudio/en-US/02ca0499-80af-4c56-bb80-f1185a619a9e/creating-generic-wpf-user-control最終的に私はXAML(ラッキーコントロールは単純です)を使用せずにジェネリックコンテナを作成しましたが、集約されましたコントロールはまだXAMLです:) – MickyD

6

臆面もなくhereからコピー(したがって、テストされていません)

public class ViewBase<T> : Window, IView where T : class, IViewModel 
{ 
    public virtual T Model 
    { 
     get { return DataContext as T; } 
     set { DataContext = value; } 
    } 
} 

とXAML

<src:ViewBase 
    x:Class="View" 
    x:TypeArguments="src:IViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:src="clr-namespace:MyNamespace" 
    Height="480" Width="640"> 
... 
</src:ViewBase> 
+1

これはVS 2010 SP1で絶対に動作し、IMOは質問への適切な答えです! 'xmlns:src'指示文はVisual Studioが名前空間を見ることができるようにするための基本的なものです。クール! – ceztko

関連する問題