2009-05-27 26 views
5

私は自分のUserControlを作成しています。私はXAMLのUserControl.Resourcesセクションの下に2つの異なるDataTemplatesを持っています。私は、リストビューに表示されるオブジェクトのプロパティの値に応じて、これらの2つのデータ型を選択したいと考えています。カスタムDataTemplateSelectorクラスを作成し、SelectTemplateメソッドをオーバーライドして、使用するDataTemplateを返すことになっています。しかし、私はUserControlsリソースセクションにある私のデータテンプレートを "見つける"ことができません。私が見たすべての例は、Window.Resourcesからデータテンプレートを取り出します。この例では、彼らは現在のメインウィンドウを取得し、その後、私は同様に私ののUserControlをフェッチんかのDataTemplateを、見つけるために、にfindResourceを使う?:WPFのDataTemplateSelectorクラスからUserControlのリソースを検索する方法は?


public override DataTemplate 
      SelectTemplate(object item, DependencyObject container) 
     { 
      if (item != null && item is AuctionItem) 
      { 
       AuctionItem auctionItem = item as AuctionItem; 
       Window window = Application.Current.MainWindow; 

       switch (auctionItem.SpecialFeatures) 
       { 
        case SpecialFeatures.None: 
         return 
          window.FindResource("AuctionItem_None") 
          as DataTemplate; 
        case SpecialFeatures.Color: 
         return 
          window.FindResource("AuctionItem_Color") 
          as DataTemplate; 
       } 
      } 

      return null; 
     } 

上記の例はこちらから:ItemsControl.ItemTemplateSelector Property

答えて

6

私は通常そうのような、DataTemplateSelectorのコンストラクタにパラメータとしてユーザーコントロールとコードの後ろから私のDataTemplateSelectorをインスタンス化:

public class MyUserControl : UserControl 
{ 
    public MyUserControl() 
    { 
     Resources["MyDataTemplateSelector"] = new MyDataTemplateSelector(this); 
     InitializeComponent(); 
    } 
} 

public class MyDataTemplateSelector : DataTemplateSelector 
{ 
    private MyUserControl parent; 
    public MyDataTemplateSelector(MyUserControl parent) 
    { 
     this.parent = parent; 
    } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     parent.DoStuff(); 
    } 
} 

ない町で最もきれいな女の子が、それは仕事を得る;)

・ホープこのことができます!

+1

XAMLで同じことを行う方法はありませんか? – Joakim

+0

これはうまくいきます...しかし、これを行う推奨される方法が何であるか知っていればうれしいです。 – Joakim

+0

本当に..私ももっときれいな方法を知りたいですが、実際にこの問題をXAMLで解決できるとは思いません。コードの中に何らかのリファレンスが必要なので、最も簡単な方法は直接与えるだけです; – Arcturus

2
 <DataTemplate x:Key="addTemplate"> 
     <Button Command="{Binding Path=AddCommand}">Add</Button> 
    </DataTemplate> 

    <DataTemplate x:Key="editTemplate"> 
     <Button Command="{Binding Path=UpdateCommand}">Update</Button> 
    </DataTemplate> 

    <TemplateSelectors:AddEditTemplateSelector 
     AddTemplate="{StaticResource addTemplate}" 
     EditTemplate="{StaticResource editTemplate}" 
     x:Key="addEditTemplateSelector" /> 

XAMLだけ!

6

これを試してみてください:

public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item != null && item is AuctionItem) 
     { 
      AuctionItem auctionItem = item as AuctionItem; 

      switch (auctionItem.SpecialFeatures) 
      { 
       case SpecialFeatures.None: 
        return 
         ((FrameworkElement)container).FindResource("AuctionItem_None") 
         as DataTemplate; 
       case SpecialFeatures.Color: 
        return 
         ((FrameworkElement)container).FindResource("AuctionItem_Color") 
         as DataTemplate; 
      } 
     } 

     return null; 
    } 
0

A WinRTの&のWindows Phoneソリューションは、親コントロールが見つかるまで、ビジュアルツリーを上に移動する必要:

FindParent方法は、ここで受け入れ答えに基づいています
protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) 
    { 
     var parent = FindParent<MyParentControlType>(container as FrameworkElement); 

     if(parent != null) 
     { 
      if (item is Something) 
       return parent.Resources["TemplateForSomething"] as DataTemplate; 
      else if(item is SomethingElse) 
       return parent.Resources["TemplateForSomethingElse"] as DataTemplate; 
      else 
       // etc 
     } 
     else 
     { 
      return App.Current.Resources["SomeFallbackResource"] as DataTemplate; 
     } 
    } 

    public static T FindParent<T>(FrameworkElement element) where T : FrameworkElement 
    { 
     FrameworkElement parent = Windows.UI.Xaml.Media.VisualTreeHelper.GetParent(element) as FrameworkElement; 

     while (parent != null) 
     { 
      T correctlyTyped = parent as T; 

      if (correctlyTyped != null) 
       return correctlyTyped; 
      else 
       return FindParent<T>(parent); 
     } 

     return null; 
    } 

How to get a ListView from a ListViewItem?

関連する問題