2016-12-05 7 views
1

Ich habe eine DataGrid, die zu einem ObservableCollection in meiner Universal Windows Platform App gebunden ist.Wie debuggen UWP XAML-Bindungen?

Das Datagrid wird nicht angezeigt, wenn die Seite geladen wird. Ich habe ein anderes Datagrid auf der gleichen Seite, das fast das selbe ist aber zu einer anderen Sammlung binded fast die gleiche wie die erste (die Bindungsprobleme hat).

Gibt es eine Möglichkeit, die XAML Datei zu debuggen?

Beispielcode:

<GridView Name="HourGridView" Grid.Row="4" 
      ItemsSource="{x:Bind ForeCastsByDates}" 
      Foreground="Chartreuse" > 

    <GridView.ItemTemplate> 
     <DataTemplate x:DataType="data:ForeCast"> 
         ....... 
     </DataTemplate> 
    </GridView.ItemTemplate> 

</GridView> 

Die Sammlung, die nicht binded ist:

private ObservableCollection<ForeCast> ForeCastsByDates; 

Die Sammlung, die gut binded:

private ObservableCollection<ForeCast> ForeCasts; 

Die ForeCastsByDates ist ein Teil von Prognosen:

ForeCastsByDates = new ObservableCollection<ForeCast>(ForeCasts.GroupBy(x => x.Date).Select(x => x.First())); 
+0

Beispielcode teilen –

+0

@VinothRajendran Hat meine Post mit Beispielcode bearbeitet – axcelenator

+0

Ist 'ForeCastsByDates' über Änderungen am Objekt (nicht über die Objekte) benachrichtigt?Wenn nicht, kann 'set'-Operationen auf' ForeCastsByDates' eine Benachrichtigung ausgeben oder die Sammlung einmal in ctor setzen und '.Clear' und' .Add' für zukünftige Anpassungen verwenden. –

Antwort

0

Wenn ich nicht falsch bin, scheint es, dass Sie tatsächlich zu einer Klasse Feld zu binden versuchen keine Eigenschaft.

Datenbindung erfordert Eigenschaften, um ordnungsgemäß zu funktionieren. Um dies zu erreichen, müssen Sie ein private Hintergrundfeld und eine public Eigenschaft erstellen, auf die dann mit Datenbindung zugegriffen werden kann.

private ObservableCollection<ForeCast> _foreCastsByDates; 
public ObservableCollection<ForeCast> ForeCastsByDates 
{ 
    get 
    { 
     return _foreCastsByDates; 
    } 
    set 
    { 
     _foreCastsByDates = value; 
     //notify about changes 
     OnPropertyChanged(); 
    } 
} 

Sie die Eigenschaft bemerkt haben verwendet eine OnPropertyChanged() Methode in der Setter. Um tatsächlich die Benutzeroberfläche über Änderungen der Immobilie zu informieren, müssen Sie den INotifyPropertyChanged-Schnittstelle auf Ihrem Page implementieren:

public partial MainPage : Page, INotifyPropertyChanged 
{ 
    // your code... 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));    
    } 
} 

Die OnPropertyChanged Methode, um das PropertyChanged Ereignis ausgelöst, die die Zuhörer darüber informiert, dass eine Eigenschaft geändert wird. In diesem Fall müssen wir über die Änderungen an der ForeCastsByDates Eigenschaft informieren. nur mit dem CallerMemberNameAttribute neben dem OnPropertyChanged Methodenparameter verwendet, wird der Parameter auf den Namen des Anrufers (in diesem Fall die ForeCastsByDates Eigenschaft automatisch eingestellt.

schließlich die {x:Bind} Syntax standardmäßig OneTime Modus, das heißt, es wird aktualisiert nicht einmal und nicht auf Eigenschaft geändert hören. um alle späteren Aktualisierungen der Immobilie sicherzustellen, werden reflektiert, verwenden

{x:Bind ForecastsByDates, Mode=OneWay} 

Wichtig zu erwähnen ist, dass Sie Änderungen an der ForecastsByDates Eigenschaft machen müssen sich die Benutzeroberfläche benachrichtigen (die Eigenschaft s etter muss ausgeführt werden, um die Methode OnPropertyChanged aufzurufen. Wenn Sie nur _foreCastsByDates = something tun, wird das Feld geändert, aber die Benutzeroberfläche wird nicht darüber informiert und die Änderung wird nicht wiedergegeben.

+0

Nein, x: Bindung kann an Felder gebunden werden. Und wird aktualisiert, wenn Sie RaisePropertyChanged auf andere Weise anordnen. Natürlich kein guter Stil. –

+0

Cool! Wusste das nicht: -O –