将Silverlight TabControl绑定到集合

use*_*236 5 collections silverlight binding tabcontrol datatemplate

我的ViewModel中有一个模型对象集合.我希望能够将TabControl绑定到这些并使用DataTemplate从Model对象中提取信息.当我尝试这样做时,我得到errormessage:无法将Model类型的对象强制转换为TabItem类型的对象.花了一些时间寻找解决方案后,我发现了以下内容:

  1. Silverlight TabControl已损坏.使用ListBox和ContentControl的组合来模仿TabControl的行为.(意味着我必须将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>
Run Code Online (Sandbox Code Playgroud)

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"}
    };
}
Run Code Online (Sandbox Code Playgroud)

推荐转换器:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Med*_*tor 2

创建转换器

\n\n
public class SourceToTabItemsConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            try\n            {\n                var source = (IEnumerable)value;\n                if (source != null)\n                {\n                    var controlTemplate = (ControlTemplate)parameter;\n\n                    var tabItems = new List<TabItem>();\n\n                    foreach (object item in source)\n                    {\n                        PropertyInfo[] propertyInfos = item.GetType().GetProperties();\n\n                        //\xd1\x82\xd1\x83\xd1\x82 \xd0\xbc\xd1\x8b \xd0\xb2\xd1\x8b\xd0\xb1\xd0\xb8\xd1\x80\xd0\xb0\xd0\xb5\xd0\xbc, \xd1\x82\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xb5 \xd0\xba\xd0\xbe\xd1\x82\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb5 \xd0\xb1\xd1\x83\xd0\xb4\xd0\xb5\xd1\x82 Header. \xd0\x92\xd1\x8b \xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb6\xd0\xbd\xd1\x8b \xd1\x81\xd0\xb0\xd0\xbc\xd0\xb8 \xd0\xb2\xd0\xb2\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x82\xd1\x8c \xd1\x8d\xd1\x82\xd0\xbe \xd0\xb7\xd0\xbd\xd0\xb0\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5.\n                        var propertyInfo = propertyInfos.First(x => x.Name == "name");\n\n                        string headerText = null;\n                        if (propertyInfo != null)\n                        {\n                            object propValue = propertyInfo.GetValue(item, null);\n                            headerText = (propValue ?? string.Empty).ToString();\n                        }\n\n                        var tabItem = new TabItem\n                                          {\n                                              DataContext = item,\n                                              Header = headerText,\n                                              Content =\n                                                  controlTemplate == null\n                                                      ? item\n                                                      : new ContentControl { Template = controlTemplate }\n                                          };\n\n                        tabItems.Add(tabItem);\n                    }\n\n                    return tabItems;\n                }\n                return null;\n            }\n            catch (Exception)\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// ConvertBack method is not supported\n        /// </summary>\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            throw new NotSupportedException("ConvertBack method is not supported");\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建控制模板:

\n\n
<ControlTemplate x:Key="MyTabItemContentTemplate">\n            <StackPanel>\n                <TextBlock Text="{Binding Path=name}" />\n            </StackPanel>\n        </ControlTemplate>\n
Run Code Online (Sandbox Code Playgroud)\n\n

并绑定convert、controltemplate

\n\n
<controls:TabControl  x:Name="tabControl"\n        ItemsSource="{Binding ElementName=tabControl, \n                              Path=DataContext, \n                              Converter={StaticResource ConverterCollectionToTabItems}, \n                              ConverterParameter={StaticResource MyTabItemContentTemplate}}">\n        </controls:TabControl>\n
Run Code Online (Sandbox Code Playgroud)\n\n

摘自博客绑定选项卡控件

\n