У меня есть приложение WPF с Combobox и Button. После того, как я ввожу значение в текстовое поле и нажимаю кнопку, значение из текстового поля должно появиться в обновленном списке поля со списком. Я пытаюсь добиться этого с помощью MVVM и привязки к combobox. Вот часть кода из 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 для доступа к БД, а в классе 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 Отредактировано под вопросом





Проблема в том, что событие 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, а не событие, чтобы вы могли обновлять ObservableCollection непосредственно внутри ViewModel.
Пример:
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();
}
какая-либо ошибка в окне вывода?