2017-08-24 3 views
0

ObservavebleColectionをlistViewにバインドしました。基本的に、このコレクションはサーバーのすべての変更に対応し、更新を文字列形式で受け取る必要があります。ユニークな要素を追加し、C#でObservableCollectionを自動的に更新します

私のコードでは、文字列を解析して要素をコレクションに追加していますが、要素を削除する方法がわかりません。サーバー上で要素が削除または変更されたときに、コレクションを更新するにはどうすればよいですか?ここで

は私のコードです:

public static ObservableCollection<TransactionDetails> offerList = new ObservableCollection<TransactionDetails>(); 

public async static Task<ObservableCollection<TransactionDetails>> getOfferList() 
    { 
     // Start getting Offers 

     string Offer = await BedpAPI_V1.getOfferList(); 

     string[] splitedResponse = Offer.Split(new[] { "@@@@" }, StringSplitOptions.RemoveEmptyEntries); 

     foreach (string response in splitedResponse) { 
      string[] splitedMessage = response.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries); 

      offer.TransactionID = Convert.ToInt32(splitedMessage[0]); 
      offer.Seller = splitedMessage[1]; 
      offer.Cost = Convert.ToDouble(splitedMessage[2]); 
      offer.Duration = Convert.ToInt16(splitedMessage[3]); 
      offer.Delay = Convert.ToInt16(splitedMessage[4]); 
      offer.Capacity = Convert.ToDouble(splitedMessage[5]); 
      offer.Availability = Convert.ToDouble(splitedMessage[6]); 

      if (currentOffer <= offer.TransactionID) 
      { 
       offerList.Add(new TransactionDetails() { TransactionID = offer.TransactionID, Seller = offer.Seller, Cost = offer.Cost, Duration = offer.Duration, Delay = offer.Delay, Capacity = offer.Capacity, Availability = offer.Availability }); 

       currentOffer++; 
      } 
     } 
     return offerList; 
    } 
+0

@mjwills clear: "要素が削除されたり、サーバー上で変更されたときにコレクションを更新するにはどうすればよいですか?" –

+0

あなたのコードは@DiogoCostaで何をしますか?たとえば、例外がスローされますか? **それはどうしたらうまくいかないのですか?** – mjwills

+0

コードはそれが想定しているとおりに動作します(つまり、文字列を解析して要素をコレクションに追加します)。私は、現在の要素を削除する方法を見つけることができません。 –

答えて

0

私はsplitedResponseを解析する前に、すべての呼び出しで、コレクションをクリアして、問題を解決 - クリア(とが)unheld例外を投げていた、スローcatchブロック内で処理するために持っていた:私はそれがだと思う

try 
{ 
    offerList.Clear(); 
} 

catch (Exception ex) { 

    offerList.Clear(); 
    Console.WriteLine(ex.Message); 
} 
0

ObservavebleColection<>を使用してリストビューバインドする場合は、要素を変更するとき、あなたはOnCollectionChangedイベントを自分で発射することがあります。 あなたは[]を使用して要素を変更すると仮定します

public class MyCollection : ObservableCollection<MyClass> 
{ 
    public new MyClass this[int index] 
    { 
     get { return base[index]; } 
     set 
     { 
      base[index] = value; 
      base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
     } 
    } 
} 

UPDATE:まず

、あなたのようなあなたのコレクションをバインドしたいことがあります。あなたのようなあなたのコレクション内の項目を変更した場合

myCollection = MyFunction(); 
MyListView.ItemsSource = myCollection; 

myCollection[index] = someNewItem; 

次のようなものがあります。

MyListView.Refresh(); 

ただし、動的バインディングを使用することをお勧めします。

+0

助けてくれてありがとう、しかし、私の問題は実際に要素を変更する方法にあるので、私はそれが私の問題を解決しないと思う。 –

+0

私は '[]'インデクサーを使って簡単な例の答えを更新しました。 – Dia

+0

助けてくれてありがとう。私は解決策を見つけることができました。 –

関連する問題