none
Löschen von items aus ObservableCollection (LongListSelector) ==> System.Windows.Markup.XamlParseException RRS feed

  • Frage

  • Hallo,

    kann mir bitte jemand bei der Behebung dieser XamlParse Exception helfen? Ich entwickle eine WP8.1 App (VS 2013). Ich verwende eine ObservableCollection und binde diese auf einen LongListSelector, der auf einem PivotItem ist. Das funktioniert soweit, die Items werden angezeigt. Sobald ich aber ein Item lösche, bekomme ich eine XamlParseException. Diese bekomme ich nur dann, denn meinen Canvas auf Position Grid.Row="1" ist. Gebe ich die Canvas auf Grid.Row="0" ist alles ok.

    Kann mir jemand sagen, was ich hier falsch mache? Ich habe es in einem wirklich einfachen Beispiel mit einem TextBlock und einer Polyline nachgestellt (meine Anwendung ist etwas komplexer, aber das einfache Beispiel liefert schon den Fehler).

    Danke im Voraus, Christian

    at MS.Internal.XcpImports.UIElement_Measure(UIElement element, Size availableSize) at System.Windows.UIElement.Measure(Size availableSize) at Microsoft.Phone.Controls.LongListSelector.RealizeDisplayItem(Iterator`1 iterator, RealizeOptions options) at Microsoft.Phone.Controls.LongListSelector.RealizedRange.Append(RealizedRange nextRange, Double bottom) at Microsoft.Phone.Controls.LongListSelector.AppendElement(RealizedRange range, RealizedRange nextRange, Double bottom) at Microsoft.Phone.Controls.LongListSelector.HealElements(Rect requireRect, Rect allowRect, Boolean& areBoundsUpdated) at Microsoft.Phone.Controls.LongListSelector.Balance(Boolean containerViewport) at Microsoft.Phone.Controls.LongListSelector.MeasureOverride(Size availableSize) at System.Windows.FrameworkElement.MeasureOverride(IntPtr nativeTarget, Double inWidth, Double inHeight, Double& outWidth, Double& outHeight

    <phone:PivotItem x:Name="PivotMyPage" Header="My Page" >
    <Grid x:Name="LayoutMyPage" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <phone:LongListSelector Name="LLS_MyItems" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding myItemCollection}" >
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate x:Name="DataTemplateMyPage">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <TextBlock  Grid.Row="0"  Grid.Column="0" Text="{Binding Title}" HorizontalAlignment="Left" />
                        <Canvas     Grid.Row="1"  Grid.Column="1" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" >
                            <Polyline Canvas.Left="0" Canvas.Top="0" Points="{Binding PC}" Stroke="Gray" StrokeThickness="4" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Canvas>
                    </Grid>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </Grid>

    bool mainPivotLoaded = false;
        private ObservableCollection<MyItem> myItemCollection = new ObservableCollection<MyItem>();
    
        public MainPage()
        {
            InitializeComponent();
            DataContext = App.ViewModel;
            LLS_MyItems.ItemsSource = myItemCollection;
    
            for (int x = 0; x < 20; x++)
            {
                MyItem i = new MyItem();
                i.Title = "Hello" + x.ToString();
                myItemCollection.Add(i);
            }
    
            DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
            dt.Tick += new EventHandler(Dt_Tick);
            dt.Interval = new TimeSpan(0, 0, 0, 1, 0);
            dt.Start();
        }
    
        private void Dt_Tick(object sender, EventArgs e)
        {
            if (myItemCollection.Count > 0 && mainPivotLoaded)
                myItemCollection.RemoveAt(0);
        }
        private void MainPivot_Loaded(object sender, RoutedEventArgs e)
        {
            mainPivotLoaded = true;
        }
    
    
    
    class MyItem : INotifyPropertyChanged
    {
        public string Title { get; set; }
        public PointCollection PC { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public MyItem()
        {
            PC = new PointCollection();
            PC.Add(new Point(1, 1));
            PC.Add(new Point(10, 10));
        }
    }



    • Bearbeitet cx100 Mittwoch, 16. September 2015 02:53
    Donnerstag, 10. September 2015 21:33

Antworten

  • Ich habe selbst die Antwort gefunden: Es ist ein bekanntes Problem (phone.codeplex.com/workitem/10857). Alle die angegebenen Lösungsvorschläge mit Ableitung der LongListSelector Klasse haben nicht funktioniert. Der Workaround sieht folgendermaßen aus: Ich definiere die PolyLine nicht in Xaml sondern zeichne sie im Code-Behind auf eine Canvas und erstelle ein Image daraus. Auf dieses Image mache ich im Xaml ein Databinding.
    Mittwoch, 16. September 2015 02:51