【问题标题】:WPF combobox does not update when values change值更改时 WPF 组合框不会更新
【发布时间】:2018-07-20 12:59:44
【问题描述】:

我有带有 Combobox 和 Button 的 WPF 应用程序。在我在文本框中输入值并按下按钮后,文本框中的值应该出现在组合框的更新列表中。我正在尝试使用 MVVM 并绑定到组合框来实现这一点。这是 ViewModel 的部分代码。

public class ViewModel:INotifyPropertyChanged
    {

        DomainLogic dl = new DomainLogic();

        public event PropertyChangedEventHandler PropertyChanged;

        private ObservableCollection<string> expenseCategories = new ObservableCollection<string>();

        public ObservableCollection<string> ExpenseCategories
        {
            get
            {
                return expenseCategories;
            }
            set
            {
                expenseCategories = value;
                OnPropertyChanged("ExpenseCategories");
            }
        }

        public ViewModel()
        {
            expenseCategories = new ObservableCollection<string>(dl.GetExpenseCategories());
        }

        private void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }

另外我正在使用 EF 访问 DB,DomainLogic 类有一个列出所有费用类别的方法。

这是来自窗口的代码隐藏:

        DomainLogic dl = new DomainLogic();
        public Window1()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(textBox.Text))
            {
                dl.CreateNewExpenseCategory(textBox.Text);
            }
            else
            {
                MessageBox.Show("Enter category!");
            }
        }

这里也是 XAML:

<ComboBox x:Name="ExpCategory" HorizontalAlignment="Left" Margin="72,50,0,0" VerticalAlignment="Top" Width="130" ItemsSource="{Binding ExpenseCategories, UpdateSourceTrigger=PropertyChanged}" />

当我添加新类别时,组合框不会更新。我是整个 MVVM 模式的新手,我想我在这里遗漏了一些东西。

//编辑

public void CreateNewExpenseCategory(string name)
        {
            using (var context = new ExpenseEntities())
            {
                ExpenseCategory category = new ExpenseCategory() { CategoryName = name};
                context.ExpenseCategory.Add(category);
                context.SaveChanges();
            }
        }

【问题讨论】:

  • 输出窗口有错误吗?
  • @RackM 没有错误
  • 它是如何制作的(dl.CreateNewExpenseCategory(textBox.Text))?
  • @Babbillumpa 编辑有问题

标签: c# wpf entity-framework mvvm viewmodel


【解决方案1】:

问题是CollectionChanged 事件没有触发。

您在 DataContext 中添加了一个新元素,但并未更新本地数据视图。

更新 DataContext 后,您应该刷新 ObservableCollection 或使用 Local。

在这里你可以如何使用Local

public ViewModel()
{
      expenseCategories = dl.GetExpenseCategories().Local;
}

所以你可以直接这样做:

expenseCategories.Add(new ExpenseCategory() {textBox.Text});
dl.GetContext().SaveChanges();

或者你必须更新ObservableCollection

dl.CreateNewExpenseCategory(textBox.Text);
// Update your ViewModel ObservableCollection.

但是我认为您应该使用 Command 而不是事件,以便您可以直接在 ViewModel 中更新 ObservableCollection

例子:

using Prism.Commands;
//Other usings
public class ViewModel : INotifyPropertyChanged
{
// Your class methods and properties
    public DelegateCommand<string> AddNewExpenseCategory
    {
       get
       {
            return new DelegateCommand<string>(Execute_AddNewExpenseCategory);
       }
    }

    public void Execute_AddNewExpenseCategory(string param)
    {
        expenseCategories.Add(new ExpenseCategory() { param });
        dl.GetContext().SaveChanges();
    }

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2012-11-27
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多