C# 值更改时,WPF组合框不会更新
我有一个带有组合框和按钮的WPF应用程序。在我将值输入textbox并按下按钮后,textbox中的值应该出现在combobox的更新列表中。我正试图通过MVVM和绑定到combobox来实现这一点。下面是来自ViewModel的部分代码C# 值更改时,WPF组合框不会更新,c#,wpf,entity-framework,mvvm,viewmodel,C#,Wpf,Entity Framework,Mvvm,Viewmodel,我有一个带有组合框和按钮的WPF应用程序。在我将值输入textbox并按下按钮后,textbox中的值应该出现在combobox的更新列表中。我正试图通过MVVM和绑定到combobox来实现这一点。下面是来自ViewModel的部分代码 public class ViewModel:INotifyPropertyChanged { DomainLogic dl = new DomainLogic(); public event PropertyCha
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));
}
}
以下是XAML:
<ComboBox x:Name="ExpCategory" HorizontalAlignment="Left" Margin="72,50,0,0" VerticalAlignment="Top" Width="130" ItemsSource="{Binding ExpenseCategories, UpdateSourceTrigger=PropertyChanged}" />
问题是,
CollectionChanged
事件不会触发
您正在DataContext中添加新元素,但没有更新数据的本地视图
更新DataContext后,应刷新您的ObservableCollection
或使用Local
以下是如何使用Local
:
public ViewModel()
{
expenseCategories = dl.GetExpenseCategories().Local;
}
因此,您可以直接执行以下操作:
expenseCategories.Add(new ExpenseCategory() {textBox.Text});
dl.GetContext().SaveChanges();
或者,您必须更新可观察收集
:
dl.CreateNewExpenseCategory(textBox.Text);
// Update your ViewModel ObservableCollection.
但是,我认为应该使用命令,而不是事件,这样就可以直接在ViewModel内部更新ObservableCollection
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));
}
}
例如:
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();
}
使用Prism.Commands;
//其他用途
公共类视图模型:INotifyPropertyChanged
{
//您的类方法和属性
public DelegateCommand addNewExpenseCegory
{
得到
{
返回新的DelegateCommand(执行_addNewExpenseContegory);
}
}
public void Execute_addNewExpenseCography(字符串参数)
{
添加(新的ExpenseCography(){param});
dl.GetContext().SaveChanges();
}
Output window中有错误吗?@RackM无错误显示是否(dl.createNewExpenseCography(textBox.Text))已生成?@Babbillumpa正在编辑中
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();
}