2010-09-02 22 views
5

Ich habe eine Sammlung von Model-Objekten in meinem ViewModel. Ich möchte in der Lage sein, ein TabControl an diese zu binden und eine DataTemplate zu verwenden, um die Information aus den Model-Objekten zu extrahieren. Wenn ich das versuche, erhalte ich die Fehlermeldung: Das Objekt vom Typ Model kann nicht in ein Objekt vom Typ TabItem umgewandelt werden. Nachdem er fand einige Zeit auf der Suche nach einer Lösung, ich folgendes:Eine Silverlight TabControl an eine Sammlung binden

  1. The Silverlight TabControl ist gebrochen. Verwenden Sie eine Kombination aus ListBox und ContentControl, um das Verhalten eines TabControls nachzuahmen. (Mittel , dass ich die List-Box, um die Haut muß aussehen wie ein TabControl)

  2. TabControl enthebt nicht PrepareContainerForItemOverride und die Lösung ist einen Converter zu machen. (Nicht so gut, weil ich dann den Typ des convertee im Konverter angeben müssen)

kennen Wer noch keine bessere Lösung?

XAML

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

C#

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

ich die erweiterte Registerkarte erstellt haben, die nicht einen Konverter benötigt und korrekt funktioniert mit der ObservableCollection-Klasse. http://vortexwolf.wordpress.com/2011/04/09/silverlight-tabcontrol-with-data-binding/ – vorrtex

Antwort

2

erstellen Konverter

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"); 
     } 
Control

erstellen:

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

Und Bindung convert, Control

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

aus dem Blog genommen binding-tabcontrol

+1

Bitte fassen Sie den Inhalt Ihres Blogbeitrags hier in englischer Sprache zusammen. Außerdem müssen Sie angeben, dass es sich um Ihre eigene Arbeit handelt, wenn Sie auf Ihren Blog oder eine Website, ein Produkt oder ein Projekt, mit dem Sie verbunden sind, verlinken. Siehe den Abschnitt [Darf ich Produkte oder Websites bewerben, mit denen ich hier in Verbindung stehe?] (Http://stackoverflow.com/faq#promotion) in den FAQ. –

Verwandte Themen