wp7芒果中的DataTemplateSelector

时间:2011-08-28 08:28:55

标签: c# silverlight windows-phone-7 windows-phone-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,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, 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.MeasureNative(IntPtr element, Single inWidth, 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, 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, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at System.Windows.Controls.ScrollContentPresenter.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Double inWidth, Double inHeight, Double& outWidth, Double& outHeight)
   at MS.Internal.XcpImports.MeasureNative(IntPtr element, Single inWidth, Single inHeight)
   at MS.Internal.XcpImports.UIElement_Measure(UIElement element, Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.ScrollViewer.MeasureOverride(Size constraint)
   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, 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, 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, Size availableSize)
   at System.Windows.FrameworkElement.MeasureOverride(Size availableSize)
   at Microsoft.Phone.Controls.PivotItem.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, 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 inWidth, Double inHeight, Double& outWidth, 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, Object oldValue, Object newValue)
   at System.Windows.DependencyObject.UpdateEffectiveValue(DependencyProperty property, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, 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)

2 个答案:

答案 0 :(得分:1)

我无法确定问题,但似乎问题不在您的模板选择器本身,而是模板中的一个。

尝试将它们中的每一个减少到基本最小值(不同颜色的文本框)或其他东西,看看它是否有效,同时尝试添加其他类型的项目,看看会发生什么。

答案 1 :(得分:1)

一旦我安装了sdk RC,就修好了!我想这是一个MS bug。