我的应用程序中需要一个数据模板选择器.我发现
this blog在7.0上运行得很好.
将项目升级到7.1后,在设置模板时出现“未指定的错误”.
我试图将他们在博客上发布的示例项目升级到芒果,它仍然有效.我不知道我做错了什么,因为看起来这个代码对于芒果来说是好的.
有什么建议?
将项目升级到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)
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。