2009-05-27 26 views
5

मैं अपना खुद का UserControl बना रहा हूं और मेरे पास उपयोगकर्ता नियंत्रण के तहत दो अलग-अलग डेटा टेम्पलेट हैं। मेरे XAML में स्रोत अनुभाग। मैं सूची दृश्य में प्रदर्शित वस्तुओं पर किसी संपत्ति के मूल्य के आधार पर इन दो डेटामैप्लेट्स के बीच चयन करना चाहता हूं। मैं इसे कस्टम डेटा टेम्पलेट चयनकर्ता कक्षा बनाकर और ओवरराइडिंग का चयन कर रहा हूं SelectTemplate विधि जिसे डेटा टेम्पलेट को वापस करना है, जिसे मैं उपयोग करना चाहता हूं। हालांकि, मुझे नहीं पता कि UserControls संसाधन अनुभाग में स्थित मेरे डेटामैप्लेट्स को "ढूंढने" के बारे में कोई जानकारी नहीं है, मैंने देखा है कि सभी उदाहरण केवल विंडो से डेटामैप्लेट प्राप्त करते हैं। स्रोत। इस उदाहरण में वे लाने वर्तमान MainWindow और फिर 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; 
     } 

उपरोक्त उदाहरण यहां से है में मेरी UserControl लाने करते : ItemsControl.ItemTemplateSelector Property

उत्तर

6

मैं आमतौर पर मेरी DataTemplateSelector कोड से पीछे UserControl साथ पैरामीटर के रूप में 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

तो सच .. मैं भी एक सुंदर तरीका जानना चाहता हूं .. लेकिन मुझे नहीं लगता कि इस समस्या को वास्तव में एक्सएएमएल के साथ हल किया जा सकता है। आपको अपने कोड में कुछ प्रकार के संदर्भ की आवश्यकता होगी, इसलिए सबसे आसान तरीका केवल सीधे देना है;) – 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

एक WinRT & विंडोज फोन समाधान दृश्य पेड़ ऊपर जा रहा है जब तक माता-पिता नियंत्रण पाया जाता है शामिल है:

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; 
    } 

FindParent विधि स्वीकार किए जाते हैं जवाब पर आधारित है यहाँ : How to get a ListView from a ListViewItem?

संबंधित मुद्दे