c# – wp7芒果中的DataTemplateSelector
发布时间:2020-12-15 17:19:38 所属栏目:百科 来源:网络整理
导读:我的应用程序中需要一个数据模板选择器.我发现 this blog在7.0上运行得很好. 将项目升级到7.1后,在设置模板时出现“未指定的错误”. 我试图将他们在博客上发布的示例项目升级到芒果,它仍然有效.我不知道我做错了什么,因为看起来这个代码对于芒果来说是好的.
我的应用程序中需要一个数据模板选择器.我发现
this blog在7.0上运行得很好.
将项目升级到7.1后,在设置模板时出现“未指定的错误”. 我试图将他们在博客上发布的示例项目升级到芒果,它仍然有效.我不知道我做错了什么,因为看起来这个代码对于芒果来说是好的. 有什么建议? <Grid x:Name="LayoutRoot" Background="Transparent" VerticalAlignment="Stretch" > <StackPanel VerticalAlignment="Stretch"> <StackPanel Orientation="Horizontal"> <TextBlock x:Name="nameBlock" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Text="Identifier:" /> <TextBox x:Name="nameTextBox" Grid.Row="0" Grid.Column="1" Text="{Binding Path=Identifier,Mode=TwoWay}" Height="72" Width="410" TextChanged="nameTextBox_TextChanged"/> </StackPanel> <StackPanel Grid.Row="3" Grid.Column="1" Background="Black" VerticalAlignment="Stretch" > <ListBox Margin="12,12,0" Name="listBox1" Background="Transparent" ItemsSource="{Binding Path=PropertiesCollection}" VerticalAlignment="Stretch" Height="300" > <ListBox.ItemTemplate> <DataTemplate> <ViewModel:ParameterTemplateSelector Content="{Binding}"> <ViewModel:ParameterTemplateSelector.TextDataTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Key}" VerticalAlignment="Center" Grid.Column="0" /> <TextBox Name="propertyTextBox" Text="{Binding Value,Mode=TwoWay}" Grid.Column="1" Width="400" TextChanged="propertyTextBox_TextChanged" /> </Grid> </DataTemplate> </ViewModel:ParameterTemplateSelector.TextDataTemplate> <ViewModel:ParameterTemplateSelector.NumberDataTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Key}" VerticalAlignment="Center" Grid.Column="0" /> <TextBox Name="propertyTextBox" Text="{Binding Value,Mode=TwoWay}" Grid.Column="1" Width="400" TextChanged="propertyTextBox_TextChanged" /> </Grid> </DataTemplate> </ViewModel:ParameterTemplateSelector.NumberDataTemplate> <ViewModel:ParameterTemplateSelector.DateDataTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Key}" VerticalAlignment="Center" Grid.Column="0" /> <toolkit:DatePicker Grid.Column="1" Width="400" Value="{Binding Value,Mode=TwoWay}" ValueChanged="DatePicker_ValueChanged"/> </Grid> </DataTemplate> </ViewModel:ParameterTemplateSelector.DateDataTemplate> <ViewModel:ParameterTemplateSelector.TimeDataTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"></ColumnDefinition> <ColumnDefinition Width="*"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Key}" VerticalAlignment="Center" Grid.Column="0" /> <toolkit:TimePicker Grid.Column="1" Width="400" Value="{Binding Value,Mode=TwoWay}" ValueChanged="TimePicker_ValueChanged"/> </Grid> </DataTemplate> </ViewModel:ParameterTemplateSelector.TimeDataTemplate> </ViewModel:ParameterTemplateSelector> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </StackPanel> </StackPanel> </Grid> public class ParameterTemplateSelector : DataTemplateSelector { public DataTemplate TextDataTemplate { get; set; } public DataTemplate NumberDataTemplate { get; set; } public DataTemplate DateDataTemplate { get; set; } public DataTemplate TimeDataTemplate { get; set; } public DataTemplate PictureDataTemplate { get; set; } public DataTemplate NonParamDataTemplate { get; set; } public override DataTemplate SelectTemplate(object item,DependencyObject container) { string type = ""; if (item is IParam) { IParam parameter = item as IParam; type = parameter.Type; } else if (item is KeyValue) { KeyValue k = item as KeyValue; type = k.Type; } switch (type) { case "String": return TextDataTemplate; case "Text": return TextDataTemplate; case "Number": return NumberDataTemplate; case "Date": return DateDataTemplate; case "Time": return TimeDataTemplate; case "Picture": return PictureDataTemplate; default: return TextDataTemplate; } } } public abstract class DataTemplateSelector : ContentControl { public virtual DataTemplate SelectTemplate(object item,DependencyObject container) { return null; } protected override void OnContentChanged(object oldContent,object newContent) { base.OnContentChanged(oldContent,newContent); ContentTemplate = SelectTemplate(newContent,this); } } 我得到的例外是: System.Exception occurred Message=Unspecified error StackTrace: at MS.Internal.XcpImports.CheckHResult(UInt32 hr) at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element,Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Double inWidth,Double inHeight,Double& outWidth,Double& outHeight) at MS.Internal.XcpImports.MeasureOverrideNative(IntPtr element,Single inWidth,Single inHeight,Single& outWidth,Single& outHeight) at MS.Internal.XcpImports.FrameworkElement_MeasureOverride(FrameworkElement element,Double& outHeight) at MS.Internal.XcpImports.MeasureNative(IntPtr element,Single inHeight) at MS.Internal.XcpImports.UIElement_Measure(UIElement element,Size availableSize) at System.Windows.UIElement.Measure(Size availableSize) at System.Windows.Controls.VirtualizingStackPanel.MeasureChild(UIElement child,Size layoutSlotSize) at System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(Size availableSize) at System.Windows.Controls.ScrollContentPresenter.MeasureOverride(Size constraint) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Size availableSize) at System.Windows.UIElement.Measure(Size availableSize) at System.Windows.Controls.ScrollViewer.MeasureOverride(Size constraint) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(Size availableSize) at Microsoft.Phone.Controls.PivotItem.MeasureOverride(Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(Size availableSize) at Microsoft.Phone.Controls.Pivot.MeasureOverride(Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget,Double& outHeight) at MS.Internal.XcpImports.UpdateLayoutNative(IntPtr element) at MS.Internal.XcpImports.UIElement_UpdateLayout(UIElement element) at System.Windows.UIElement.UpdateLayout() at Microsoft.Phone.Controls.Pivot.OnItemsChanged(NotifyCollectionChangedEventArgs e) at System.Windows.Controls.ItemsControl.OnItemCollectionChanged(Object sender,NotifyCollectionChangedEventArgs e) at System.Windows.Controls.ItemCollection.NotifyCollectionChanged(NotifyCollectionChangedEventArgs e) at System.Windows.Controls.ItemCollection.UpdateItemsSourceList(IEnumerable newItemsSource) at System.Windows.Controls.ItemsControl.ItemsSourceChanged(DependencyObject d,DependencyPropertyChangedEventArgs e) at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp,Object oldValue,Object newValue) at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property,EffectiveValueEntry oldEntry,EffectiveValueEntry& newEntry,ValueOperation operation) at System.Windows.DependencyObject.RefreshExpression(DependencyProperty dp) at System.Windows.Data.BindingExpression.RefreshExpression() at System.Windows.Data.BindingExpression.SendDataToTarget() at System.Windows.Data.BindingExpression.SourceAcquired() at System.Windows.Data.BindingExpression.System.Windows.IDataContextChangedListener.OnDataContextChanged(Object sender,DataContextChangedEventArgs e) at System.Windows.Data.BindingExpression.DataContextChanged(Object sender,DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnAncestorDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.NotifyDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnAncestorDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.NotifyDataContextChanged(DataContextChangedEventArgs e) at System.Windows.FrameworkElement.OnPropertyChanged(DependencyProperty dp) at System.Windows.DependencyObject.RaisePropertyChangeNotifications(DependencyProperty dp,ValueOperation operation) at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp,Object value,Boolean allowReadOnlySet) at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp,Object value) at System.Windows.DependencyObject.SetValue(DependencyProperty dp,Object value) at System.Windows.FrameworkElement.set_DataContext(Object value) at WPUserControls.ViewModel.ItemsTypeViewModel.AddItem(ItemInstance itemInstance) at WPUserControls.ViewModel.ItemsTypePageViewModel.AddNewItemInstance() at WPUserControls.Views.ItemsTypePageView.AddItem() at WPUserControls.Views.ItemsTypePageView.addIcon_Click(Object sender,EventArgs e) at Microsoft.Phone.Shell.ApplicationBarItemContainer.FireEventHandler(EventHandler handler,Object sender,EventArgs args) at Microsoft.Phone.Shell.ApplicationBarIconButton.ClickEvent() at Microsoft.Phone.Shell.ApplicationBarIconButtonContainer.ClickEvent() at Microsoft.Phone.Shell.ApplicationBar.OnCommand(UInt32 idCommand) at Microsoft.Phone.Shell.Interop.NativeCallbackInteropWrapper.OnCommand(UInt32 idCommand) 解决方法
我无法确定问题,但似乎问题不在你的模板选择器本身,而是模板中的一个.
尝试将它们中的每一个减少到最小基数(不同颜色的文本框)或其他东西,看它是否有效,还尝试添加其他类型的项目,看看会发生什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |