代码之家  ›  专栏  ›  技术社区  ›  tesicg

在WPF中添加或删除项目时,如何自动刷新列表框?

  •  0
  • tesicg  · 技术社区  · 8 年前

    我有一个使用web服务(asmx)的WPF应用程序。web服务使用EF从MS SQL Server获取数据。

    代码如下:

    1) 焊接工艺流程:

    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中。我错过了什么?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Sergey Lobanov    8 年前

    您需要更改 _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);
    }