2016-04-19 11 views
0

を値を修正するために更新していない私は、WPFに新しいですので、私は見逃している非常に単純なものである可能性があります。データバインドリストボックスが観測コレクションからWPF

私はstatic observableCollection<myClass>からデータバインドさクラスのプロパティを保持しているリストボックスを持っています。コレクションはネットワークストリームソースから1秒に数回更新されており、デバッグからわかるようにコレクションは適切に更新されています。宣言は次のとおりです。static ObservableCollection<PumpItem> pumpCollection = new ObservableCollection<PumpItem>();PumpItemは私のクラスの名前です。リストボックスは、しかし、何も表示されていないと言っているわけではない

は、コレクションに追加された新しい値を表示するように更新しているが、これらは今まで、彼らはコレクションに入る最初の瞬間の性質を反映しています。

リストボックスの値は、次のような拘束されています(私の `メインウィンドウで

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

     } 

<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> 

私は後ろのコレクションにリソースを設定するために、コードでこの宣言を持っています

this.DataContext = this; 

InitialiseComponent(); and my background worker thread to receive network inputs to update the list: worker.RunWorker前に:私が設定した)コンストラクタ非同期(); `

このバックグラウンドスレッドは、ストリームからコレクションを更新し、リソースの更新を呼び出す連続ループ:

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 

     } 
} 

ことができます場合は、私のクラスのコードは、このようにある:

namespace PoSClientWPF 

{ パブリック列挙pumpState {利用 、 待つ、 揚水、 はを払います};

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; 
    } 
} 

}

私が言ったように、私はWPFに非常に新しいですので、大幅に任意のガイダンスやソリューションをいただければ幸いです。ありがとう。

+1

'これらは今まで彼らはcollection'に入る最初の瞬間の性質を反映しています。 (PumpItem中)のViewModelに変化をUIに通知する最も簡単な方法は、PumpItemで 'INotifyPropertyChanged'を実装し、スタティックとしてあなたPumpCollectionを持っていないのはなぜセッター – ASh

+0

にOnPropertyChangedをイベントを発生させるのですか?これは設計上の決定なのですか、バインディングを働かせようとしていますか? –

+0

@MattWilkinsonあなたは私を持っている、それが絶望の行為だと思う。なぜ私は静的にする必要があるのか​​考えられない。だから公然とそれは行く。 (getメソッドPumpCollectionを参照していて、静的にする予定の実際のpumpCollectionコレクションではない場合。 – James

答えて

1

アッシュは完全に正しかったが、ここであなたは脱脂するための簡単な例です。これは、典型的にはすべてのViewModelが継承するViewModelBaseの例です。私のレポの1つから。 OnChangedEventを呼び出す方法。

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

これは、プロパティが変更されたときにすべてを更新する場所です。

+0

私は本当にこのルートを終了し、必要な機能を得ることができました。また、この非常に有用な記事http://www.blackwasp.co.uk/INotifyPropertyChanged.aspxのおかげで – James

関連する問題