【发布时间】:2013-05-06 20:21:59
【问题描述】:
我对 tabcontrol 控件有疑问。
我正在使用绑定和转换器将项目动态添加到 tabcontrol。
添加第二个 tabitem 时出现以下异常(参见下面的代码): 值不在预期范围内
它的堆栈跟踪:
в MS.Internal.XcpImports.CheckHResult(UInt32 小时) в MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty 属性, DependencyObject doh) в MS.Internal.XcpImports.SetValue(IManagedPeerBase doh, DependencyProperty 属性, Object obj) в System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp,对象值) в System.Windows.DependencyObject.SetEffectiveValue(DependencyProperty 属性, EffectiveValueEntry& newEntry, Object newValue) в System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty 属性,EffectiveValueEntry oldEntry,EffectiveValueEntry&newEntry,ValueOperation 操作) в System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet) в System.Windows.Controls.ContentControl.set_Content(对象值) в SilverlightApplication1.Services.TabConverter.Convert(Object value, Type targetType, Object parameter, CultureInfoculture)
主页 xaml:
<UserControl x:Class="SilverlightApplication1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="1024"
d:DesignWidth="1280"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:local="clr-namespace:SilverlightApplication1.Services">
<UserControl.Resources>
<local:TabConverter x:Key="tabConverter" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot"
Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="4*" />
</Grid.ColumnDefinitions>
<ListBox SelectionChanged="ListBox_SelectionChanged">
<ListBoxItem Content="ViewA"></ListBoxItem>
<ListBoxItem Content="ViewB"></ListBoxItem>
</ListBox>
<sdk:TabControl Grid.Column="1"
ItemsSource="{Binding Tabs, Converter={StaticResource tabConverter}}" />
</Grid>
主页代码隐藏:
public partial class MainPage : UserControl {
ViewModel viewModel = new ViewModel();
public MainPage() {
InitializeComponent();
this.DataContext = viewModel;
}
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
try {
viewModel.Tabs.Add(new TabItemModel() {
Header = "New Tab",
Content = new Grid()
});
// sdk:tabcontrol does not listen CollectionChanged of viewModel.Tabs.
// thats why:
viewModel.Tabs = viewModel.Tabs;
} catch (Exception) { }
}
}
数据模型:
public class TabItemModel {
public string Header { get; set; }
public UIElement Content { get; set; }
}
查看模型:
public class ViewModel:INotifyPropertyChanged {
ObservableCollection<TabItemModel> tabs = new ObservableCollection<TabItemModel>();
public ObservableCollection<TabItemModel> Tabs {
get { return tabs; }
set { tabs = value; OnPropertyChanged(PropertyNames.Tabs); }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string property) {
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
class PropertyNames {
public const string Tabs = "Tabs";
}
}
制表符转换器:
public class TabConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
try {
var object_data = value as ObservableCollection<TabItemModel>;
var result = new List<TabItem>();
foreach (var item in object_data) {
result.Add(new TabItem() {
Header = item.Header,
Content = item.Content // if comment this, everything works
});
}
return result;
} catch (Exception e) {
MessageBox.Show(e.StackTrace, e.Message, MessageBoxButton.OK);
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
throw new NotImplementedException();
}
}
【问题讨论】:
-
+1 用于发布工作代码,这对我来说只是一个简单的复制粘贴 :) 一个小时后我放弃了,因为它只是不工作。海事组织这是一个有缺陷的控制。看看@Sphinxxx 的回答,我想你可以在链接 Silverlight TabControl with data binding 中使用
标签: c# silverlight mvvm converter tabcontrol