如何解决如何绑定TabControl?
| a<controls:TabControl x:Name=\"tabControlRoom\" Grid.Row=\"1\" Grid.Column=\"1\" d:LayoutOverrides=\"Width,Height\" ItemsSource=\"{Binding}\" >
<controls:TabControl.ItemTemplate>
<DataTemplate>
<controls:TabItem Header=\"{Binding name}\">
<StackPanel Margin=\"10\" Orientation=\"Horizontal\">
</StackPanel>
</controls:TabItem>
</DataTemplate>
</controls:TabControl.ItemTemplate>
</controls:TabControl>
和代码
m_roomContext.Load(m_roomContext.GetRoomQuery());
tabControlRoom.DataContext = m_roomContext.Rooms;
当我打开此页面时,所有元素都将显示,但是一秒钟后,我只会看到白色屏幕
错误:
加载操作查询失败
\'GetRoom \'。无法投射物体
输入\'Web.Room \'进行输入
\'System.Windows.Controls.TabItem \'/ \'
解决方法
创建转换器
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,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>
并绑定转换,控制模板
<controls:TabControl x:Name=\"tabControl\"
ItemsSource=\"{Binding ElementName=tabControl,Path=DataContext,Converter={StaticResource ConverterCollectionToTabItems},ConverterParameter={StaticResource MyTabItemContentTemplate}}\">
</controls:TabControl>
取自博客binding-tabcontrol
, 绑定TabControl时,需要完成两件事,一是TabItem的标题内容,另一是所选TabItem的内容,通常是另一用户控件。
我过去解决此问题的方法是将TabControl的ItemsSource绑定到视图模型的集合,并提供两个数据模板,一个为TabItem提供标题内容,另一个为提供内容选定的TabItem,它映射到一个视图。
<Window.Resources>
<DataTemplate x:Key=\"ItemTemplate\">
<TextBlock Text=\"{Binding Title}\" />
</DataTemplate>
<DataTemplate x:Key=\"ContentTemplate\">
<local:SampleView />
</DataTemplate>
</Window.Resources>
<Grid>
<TabControl
ItemsSource=\"{Binding SampleViewModels}\"
ItemTemplate=\"{StaticResource ItemTemplate}\"
ContentTemplate=\"{StaticResource ContentTemplate}\"
SelectedIndex=\"0\"
/>
</Grid>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。