2016-09-14 4 views
0

Webサービス(asmx)を使用するWPFアプリケーションがあります。 Webサービスは、EFを使用してMS SQL Serverからデータを取得します。WPFで項目を追加または削除するときにリストボックスを自動的に更新する方法はありますか?

1)WPF:

public partial class MainWindow : Window 
{ 
    LetterWebServiceSoapClient _client = new LetterWebServiceSoapClient(); 
    private ObservableCollection<Letter> _letters; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void cmdGetLetters_Click(object sender, RoutedEventArgs e) 
    { 
     lstLetters.ItemsSource = null; 
     _letters = _client.GetAllLetters(); 
     lstLetters.ItemsSource = _letters; 
    } 

    private void cmdDeleteLetter_Click(object sender, RoutedEventArgs e) 
    { 
     _client.DeleteLetter((Letter)lstLetters.SelectedItem); 
    } 

    private void cmdAddLetter_Click(object sender, RoutedEventArgs e) 
    { 
     var newLetter = new Letter 
     { 
      Name = "Letter3", 
      Date = DateTime.Now, 
      Recipient = "John", 
      Sender = "David", 
      Content = "cccc" 
     }; 
     _client.AddNewLetter(newLetter); 
    } 
} 

2)Webサービス:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService] 
public class LetterWebService : System.Web.Services.WebService 
{ 
    LetterDbEntities _letterDbEntities = new LetterDbEntities(); 

    [WebMethod] 
    public ObservableCollection<Letter> GetAllLetters() 
    { 
     return new ObservableCollection<Letter>(_letterDbEntities.Letters.ToList()); 
    } 

    [WebMethod] 
    public void AddNewLetter(Letter newLetter) 
    { 
     _letterDbEntities.Letters.Add(newLetter); 
     _letterDbEntities.SaveChanges(); 
    } 

    [WebMethod] 
    public void DeleteLetter(Letter letter) 
    { 
     var letterToBeDeleted = _letterDbEntities.Letters.First(l => l.Id == letter.Id); 
     _letterDbEntities.Letters.Remove(letterToBeDeleted); 
     _letterDbEntities.SaveChanges(); 
    } 
} 

私は新しい文字を追加したり、それらが追加され、既存のものを削除すると、次のようなコードに見える

またはデータベースレベルで削除されますが、リストボックスにあるUIでは反映されません。私は何が欠けているのですか?

+0

あなたのオブジェクト '_letters'が追加操作や削除操作中に全く変化しないので、これを試してください。 –

+0

なぜですか? _lettersはObservableCollectionタイプです。自動的に更新するだけでは不十分ですか? – tesicg

答えて

0

_lettersコレクションを変更する必要があります。これを試してください:

private void cmdDeleteLetter_Click(object sender, RoutedEventArgs e) 
{ 
    var selectedItem = (Letter)lstLetters.SelectedItem; 
    _client.DeleteLetter(selectedItem); 
    _letters.Remove(selectedItem); 
} 

private void cmdAddLetter_Click(object sender, RoutedEventArgs e) 
{ 
    var newLetter = new Letter 
    { 
     Name = "Letter3", 
     Date = DateTime.Now, 
     Recipient = "John", 
     Sender = "David", 
     Content = "cccc" 
    }; 
    _client.AddNewLetter(newLetter); 
    _letters.Add(newLetter); 
} 
+0

_lettersはObservableCollectionタイプです。自動的に更新するだけでは不十分ですか? – tesicg

+0

_lettersコレクションを変更すると、UIが確実に更新されます。しかし、あなたはしません。 –

関連する問題