use*_*236 5 collections silverlight binding tabcontrol datatemplate
我的ViewModel中有一个模型对象集合.我希望能够将TabControl绑定到这些并使用DataTemplate从Model对象中提取信息.当我尝试这样做时,我得到errormessage:无法将Model类型的对象强制转换为TabItem类型的对象.花了一些时间寻找解决方案后,我发现了以下内容:
Silverlight TabControl已损坏.使用ListBox和ContentControl的组合来模仿TabControl的行为.(意味着我必须将ListBox设置为看起来像TabControl)
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)
创建转换器
\n\npublic 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 }\nRun 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>\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n\n摘自博客绑定选项卡控件
\n| 归档时间: |
|
| 查看次数: |
3985 次 |
| 最近记录: |