【问题标题】:Wpf, how to update/refresh ui after adding data to databaseWpf,将数据添加到数据库后如何更新/刷新ui
【发布时间】:2015-04-23 15:29:42
【问题描述】:

我怎样才能做到这一点,以便每当我向数据库添加/更新/删除数据时,UI 都会更新(在 wpf 中)。 我正在使用实体框架+本地 sql。 我有以下由 entityframework 生成的类: 当我添加交易时:我需要/可以指定 Payee 和 TransactionCategory 对象。 公共部分类事务 { 公共 int TransactionId { 获取;放; }

    [Column(TypeName = "money")]
    public decimal TransactionAmmount { get; set; }

    public int? TransactionCategoryId { get; set; }

    public int? PayeeId { get; set; }

    [Column(TypeName = "money")]
    public decimal? TotalAmmount { get; set; }

    public int? TransactionType { get; set; }

    [Column(TypeName = "date")]
    public DateTime? TransactionDate { get; set; }


    public virtual Payee Payee { get; set; }

    public virtual TransactionCategory TransactionCategory { get; set; }
}


public partial class Payee
{
    public Payee()
    {
        Bills = new HashSet<Bill>();
        Transactions = new HashSet<Transaction>();
    }

    public int PayeeId { get; set; }

    [Required]
    [StringLength(50)]
    public string PayeeName { get; set; }

    public bool HasAccounts { get; set; }

    [StringLength(50)]
    public string PayeePhone { get; set; }

    [StringLength(50)]
    public string PayeeAddress { get; set; }

    public virtual ICollection<Bill> Bills { get; set; }

    public virtual ICollection<Transaction> Transactions { get; set; }
}

public partial class TransactionCategory
{
    public TransactionCategory()
    {
        Bills = new HashSet<Bill>();
        Transactions = new HashSet<Transaction>();
    }

    [Key]
    public int CategoryId { get; set; }

    [Required]
    [StringLength(50)]
    public string CategoryName { get; set; }

    [Column(TypeName = "money")]
    public decimal CategoryExpenseLimit { get; set; }

    [Column(TypeName = "money")]
    public decimal CategoryExpense { get; set; }

    [Column(TypeName = "money")]
    public decimal CategoryIncome { get; set; }

    [StringLength(50)]
    public string Period { get; set; }

    public virtual ICollection<Bill> Bills { get; set; }

    public virtual ICollection<Transaction> Transactions { get; set; }
}

在他们的视图模型中我用来添加数据的方法:

PayeeViewModel 类:以及要添加的方法。

 private void Update()
    {
        using (var context = new Ents())
        {
            if (this.Mode == Mode.Add)
            {
                if (string.IsNullOrEmpty(PayeeName))
                {
                    MessageBox.Show("A Payee Name must be entered");
                }
                else
                {      
                    PayeeModel payee = new PayeeModel() { ThePayee = { PayeeName = PayeeName, PayeeAddress = PayeeAddress, PayeePhone = PayeePhone, HasAccounts = PayeeHasAccount } };

                        context.Payees.Add(payee.ThePayee);
                        context.SaveChanges();

                }
            }
       }
   }

TransactionCategoryViewModel 的更新方法除了字段之外是相同的。

在我的 TransactionViewModel 中:

我有一个收款人和一个类别列表:

收款人名单:

 private ObservableCollection<PayeeModel> payees;
        private PayeeModel selectedPayee;

        public ObservableCollection<PayeeModel> Payees
        {
            get { return payees; }
            set
            {
                payees = value;
                OnPropertyChanged("Payees");
            }
        }

        public PayeeModel SelectedPayee
        {
            get { return selectedPayee; }
            set { selectedPayee = value;
            OnPropertyChanged("SelectedPayee");
            }
        }

分类列表

private ObservableCollection<CategoryModelModel> categories;
        private CategoryModel selectedCategory;

        public ObservableCollection<CategoryModel> Categories
        {
            get { return payees; }
            set
            {
                payees = value;
                OnPropertyChanged("Categories");
            }
        }

        public CategoryModel SelectedCategory
        {
            get { return selectedCategory; }
            set { selectedCategory = value;
            OnPropertyChanged("SelectedCategory");
            }
        }

以及TransactionViewModel的构造函数

  internal TransactionViewModel(TransactionModel transaction, IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        TransactionId = transaction.TheTransaction.TransactionId;
        ammount = (double)transaction.TheTransaction.TransactionAmmount;
        PayeeId = transaction.TheTransaction.PayeeId;

         GetCategories();
         GetPayees();
         SelectedPayee = payees.Where(i => i.ThePayee.PayeeId == PayeeId).First();
         SelectedCatgory = categories.Where(i => i.TheCategory.CategoryId == CategoryId).First();


    }

当我将收款人或交易类别添加到数据库时,我希望它反映在包含收款人或交易类别的所有视图中。 例如在 TransactionView 中(用于添加/编辑交易) 我有 TransactionClass 中提到的字段和两个组合框:一个绑定到 Payees 列表,一个绑定到 CategoriesList。

问题是,如果我添加/删除或更新 Payee/TransactionCategory,TransactionView 中的组合框不会相应更新。

TransactionView 组合框:

   <Label Content="Payee" Grid.Row="2" Margin="3" />
        <ComboBox Grid.Column="1" Grid.Row="2" Margin="3" Width="100" ItemsSource="{Binding Payees}" SelectedItem="{Binding SelectedPayee}"
                  DisplayMemberPath="ThePayee.PayeeName"/>
        <Label Content="Category" Grid.Row="3" Margin="3" />
        <ComboBox Grid.Column="1" Grid.Row="3" Margin="3" Width="100" ItemsSource="{Binding Categories}" 
                  SelectedItem="{Binding SelectedCategory}"  DisplayMemberPath="TheCategory.CategoryName" />

【问题讨论】:

  • 我没有看到你真正更新你所说的组合框。
  • @Ebrown 我已经添加了它们,但我不确定更新它们是什么意思?
  • 实现 INotifyPropertyChanged 并在属性发生更改时触发事件。
  • 例如,您声称在PayeeViewModel 中有一个Update 方法,但您实际上并没有使用它来通知任何更新。正如@clcto 所说,您应该实现一个事件并订阅需要通知它的内容。
  • 你知道任何文章或样本吗?我对编程有点陌生,所以我有点困惑。

标签: c# wpf entity-framework


【解决方案1】:

应答,因此它不会保持打开状态。 我在启动时创建了一个 ObservableCollection,我将其添加为资源,然后在需要它们的地方声明本地实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2013-02-27
    • 2015-08-15
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多