2010-09-02 20 views
5

मेरे पास मेरे व्यूमोडेल में मॉडल-ऑब्जेक्ट्स का संग्रह है। मैं इनके लिए एक टैबकंट्रोल बांधने और मॉडल-ऑब्जेक्ट्स से जानकारी निकालने के लिए डेटा टेम्पलेट का उपयोग करने में सक्षम होना चाहता हूं। जब मैं ऐसा करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है: टैबिटेम प्रकार के ऑब्जेक्ट के लिए मॉडल के प्रकार को ऑब्जेक्ट करने में असमर्थ।संग्रह में एक सिल्वरलाइट टैबकंट्रोल बांधें

  1. सिल्वरलाइट TabControl टूट गया है: कुछ समय बिताने के लिए एक समाधान के लिए देखने के बाद मैं निम्नलिखित पाया। TabControl के व्यवहार की नकल करने के लिए ListBox और ContentControl के संयोजन का उपयोग करें। (मतलब मैं ListBox को एक TabControl की तरह लग रही त्वचा के लिए है कि)

  2. TabControl PrepareContainerForItemOverride और समाधान एक कनवर्टर बनाना है हावी नहीं होता। (इतना अच्छा नहीं है क्योंकि मैं तो कनवर्टर में convertee के प्रकार निर्दिष्ट करने की आवश्यकता)

कोई भी किसी भी बेहतर समाधान पता है?

XAML

<sdk:TabControl ItemsSource="{Binding Items, ElementName=MyControl}"> 
     <sdk:TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
      </DataTemplate> 
     </sdk:TabControl.ItemTemplate> 
    </sdk:TabControl> 

#

सी
public ObservableCollection<Model> Items { get; set; } 

public ViewModel() 

    Items = new ObservableCollection<Model>{ 
     new Model { Name = "1"}, 
     new Model { Name = "2"}, 
     new Model { Name = "3"}, 
     new Model { Name = "4"} 
    }; 
} 

Suggested Converter:

public class TabConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     List<TabSource> source = value as List<TabSource>; 
     if (source != null) 
     { 
      List<TabItem> result = new List<TabItem>(); 
      foreach (TabSource tab in source) 
      { 
       result.Add(new TabItem() 
       { 
        Header = tab.Header, 
        Content = tab.Content 
       }); 
      } 
      return result; 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

मैं विस्तारित टैब नियंत्रण जो एक कनवर्टर की जरूरत नहीं है और बना लिया है से लिया ठीक से काम करता ObservableCollection कक्षा के साथ। http://vortexwolf.wordpress.com/2011/04/09/silverlight-tabcontrol-with-data-binding/ – vorrtex

उत्तर

2

बनाएं कनवर्टर

public class SourceToTabItemsConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      try 
      { 
       var source = (IEnumerable)value; 
       if (source != null) 
       { 
        var controlTemplate = (ControlTemplate)parameter; 

        var tabItems = new List<TabItem>(); 

        foreach (object item in source) 
        { 
         PropertyInfo[] propertyInfos = item.GetType().GetProperties(); 

         //тут мы выбираем, то поле которое будет Header. Вы должны сами вводить это значение. 
         var propertyInfo = propertyInfos.First(x => x.Name == "name"); 

         string headerText = null; 
         if (propertyInfo != null) 
         { 
          object propValue = propertyInfo.GetValue(item, null); 
          headerText = (propValue ?? string.Empty).ToString(); 
         } 

         var tabItem = new TabItem 
              { 
               DataContext = item, 
               Header = headerText, 
               Content = 
                controlTemplate == null 
                 ? item 
                 : new ContentControl { Template = controlTemplate } 
              }; 

         tabItems.Add(tabItem); 
        } 

        return tabItems; 
       } 
       return null; 
      } 
      catch (Exception) 
      { 
       return null; 
      } 
     } 

     /// <summary> 
     /// ConvertBack method is not supported 
     /// </summary> 
     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotSupportedException("ConvertBack method is not supported"); 
     } 

बनाएं ControlTemplate:

<ControlTemplate x:Key="MyTabItemContentTemplate"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=name}" /> 
      </StackPanel> 
     </ControlTemplate> 

और बाध्यकारी परिवर्तित, ControlTemplate

<controls:TabControl x:Name="tabControl" 
     ItemsSource="{Binding ElementName=tabControl, 
           Path=DataContext, 
           Converter={StaticResource ConverterCollectionToTabItems}, 
           ConverterParameter={StaticResource MyTabItemContentTemplate}}"> 
     </controls:TabControl> 

ब्लॉग binding-tabcontrol

+1

कृपया अंग्रेजी में अपने ब्लॉग पोस्ट की सामग्री को संक्षेप में सारांशित करें। साथ ही, आपको यह खुलासा करने की आवश्यकता है कि जब आप अपने ब्लॉग या किसी वेबसाइट, उत्पाद या प्रोजेक्ट से संबद्ध होते हैं तो यह आपका स्वयं का काम होता है। देखें [क्या मैं उन उत्पादों या वेबसाइटों को बढ़ावा दे सकता हूं जिनसे मैं यहां संबद्ध हूं?] (Http://stackoverflow.com/faq#promotion) FAQ के अनुभाग। –

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