2016-04-19 2 views
0

Ich bin neu in WPF also könnte etwas sehr einfaches sein, was ich verpasst habe.Datensicheres Listenfeld, das nicht auf korrekte Werte aus beobachtbarer Sammlung WPF aktualisiert

Ich habe ein Listenfeld, das datengebundene Klasseneigenschaften von einem static observableCollection<myClass> hält. Die Sammlung wird mehrmals pro Sekunde von einer Netzwerk-Stream-Quelle aktualisiert, und von dem, was ich beim Debuggen feststellen kann, wird die Sammlung ordnungsgemäß aktualisiert. Die Deklaration lautet wie folgt: static ObservableCollection<PumpItem> pumpCollection = new ObservableCollection<PumpItem>(); Dabei ist PumpItem der Name meiner Klasse.

Das soll nicht heißen, dass das Listenfeld nichts anzeigt, es wird jedoch so aktualisiert, dass alle der Sammlung hinzugefügten neuen Werte angezeigt werden. Diese spiegeln jedoch nur die Eigenschaften des ersten Moments wider, wenn sie in die Sammlung eintreten. zur Sammlung

<ListBox x:Name="pumpListBox" ItemsSource="{Binding PumpCollection}" Grid.IsSharedSizeScope="True" Margin="0,0,153,0"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition SharedSizeGroup="ID" /> 
         <ColumnDefinition SharedSizeGroup="State" /> 
         <ColumnDefinition SharedSizeGroup="Selection" /> 
         <ColumnDefinition SharedSizeGroup="Fuel Pumped" /> 
         <ColumnDefinition SharedSizeGroup="Cost" /> 
        </Grid.ColumnDefinitions> 
        <TextBlock Margin="2" Text="{Binding PumpID}" Grid.Column="0"/> 
        <TextBlock Margin="2" Text="{Binding State}" Grid.Column="1"/> 
        <TextBlock Margin="2" Text="{Binding Selection}" Grid.Column="2"/> 
        <TextBlock Margin="2" Text="{Binding FuelPumped}" Grid.Column="3"/> 
        <TextBlock Margin="2" Text="{Binding FuelCost}" Grid.Column="4"/> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Ich habe diese Erklärung in der Code-behind, um Ressourcen zu setzen

:

Die Werte der Listbox sind als solche gebunden

public static ObservableCollection<PumpItem> PumpCollection 
     { 
      get { return pumpCollection; } 

     } 

In meinem `Mainwindow () Konstruktor ich habe ein:

this.DataContext = this; 

vor InitialiseComponent(); and my background worker thread to receive network inputs to update the list: worker.RunWorker Async(); `

Dieser Hintergrund-Thread dann kontinuierlich die Sammlung aus dem Stream Schleifen aktualisiert und ruft ein Ressource-Update:

private void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //background tasks 
     Thread.Sleep(500); //allows the ui time to update and initialise 
     string s_decryptedMessage = string.Empty; 

     App.Current.Dispatcher.Invoke((Action)(() => 
     { 
      Resources["PumpCollection"] = pumpCollection; 

     })); 


     while (true) 
     { 

      byteMessage = Recieve(stream);//get the number of pumps about to be recieved 
      Interact(byteMessage); //signal server to update pumplist 

     } 
} 

Wenn es so, mein Klassencode hilft:

namespace PoSClientWPF 

{ public enum pumpState { verfügbar, Abwarten, Pumping, Bezahlen};

public enum fuelSelection 
{ 
    Petrol, 
    Diesel, 
    LPG, 
    Hydrogen, 
    None 

}; 
public class PumpItem 
{ 
    private string pumpID; 
    public string PumpID 
    { 
     get 
     { 
      return pumpID; 
     } 
     set 
     { 
      pumpID = value; 
     } 
    } 

    private double fuelPumped; 
    public double FuelPumped 
    { 
     get 
     { 
      return fuelPumped; 
     } 
     set 
     { 
      fuelPumped = value; 
     } 
    } 

    private double fuelCost; 
    public double FuelCost 
    { 
     get 
     { 

      return fuelCost; 
     } 
     set 
     { 

      fuelCost = Math.Round(value, 2); //cost to two DP 
     } 
    } 

    private fuelSelection selection; 
    public fuelSelection Selection 
    { 
     get 
     { 
      return selection; 
     } 
     set 
     { 
      selection = value; 
     } 
    } 

    private pumpState state; 
    public pumpState State 
    { 
     get 
     { 
      return state; 
     } 
     set 
     { 
      state = value; 
     } 
    } 

    public PumpItem(string _ID, pumpState _state, fuelSelection _selection) 
    { 
     this.pumpID = _ID; 
     this.FuelPumped = 0; 
     this.FuelCost = 0; 
     this.Selection = _selection; 
     this.State = _state; 
    } 
} 

}

Wie gesagt, ich bin zu WPF sehr neu so stark jede Führung oder Lösungen schätzen würde. Vielen Dank.

+1

"spiegeln diese nur die Eigenschaften des ersten Moments wider, in dem sie in die Sammlung eintreten". Die einfachste Möglichkeit, ui über Änderungen in viewModel (in PumpItem) zu benachrichtigen, besteht darin, 'INotifyPropertyChanged' in PumpItem zu implementieren und das OnPropertyChanged-Ereignis in Settors zu erhöhen. – ASh

+0

Warum haben Sie PumpCollection als statisch? Ist das eine Designentscheidung oder versucht man die Bindung an die Arbeit zu bringen? –

+0

@MattWilkinson Du hast mich, denke, es war ein Akt der Verzweiflung. Ich kann mir keinen Grund vorstellen, warum ich es statisch brauche. Also zurück zum Publikum. (Wenn Sie sich auf die Methode pumpCollection beziehen, und nicht auf die pumpCollection-Sammlung, die statisch sein soll. – James

Antwort

1

Ash war völlig korrekt, aber hier ist ein schnelles Beispiel für Sie zu überfliegen. Dies ist ein Beispiel für eine ViewModelBase, von der normalerweise alle ViewModels erben. Von einem meiner Repos. So würden Sie Ihr OnChangedEvent nennen.

private sample _Item; 
    public sample Item 
    { 
     get 
     { 
      return _Item; 
     } 
     set 
     { 
      if (_Item != value) 
      { 
       _Item = value; 
       OnPropertyChanged("Item"); 
      } 
     } 
    } 

Dies wird es bekommen, wo Sie alles aktualisieren, wenn Eigenschaften ändern.

+0

Ich bin tatsächlich am Ende diesen Weg gegangen und habe es geschafft, die erforderliche Funktionalität zu bekommen. Auch dank dieses sehr nützlichen Artikels http://www.blackwasp.co.uk/INotifyPropertyChanged.aspx – James

Verwandte Themen