gpt4 book ai didi

c# - WPF 组合框在值更改时不更新

转载 作者:行者123 更新时间:2023-11-30 23:00:43 26 4
gpt4 key购买 nike

我有带有组合框和按钮的 WPF 应用程序。在我将值输入文本框并按下按钮后,文本框中的值应该出现在更新的组合框列表中。我正在尝试使用 MVVM 并绑定(bind)到组合框来实现这一点。这是来自 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();
}
}

最佳答案

问题是 CollectionChanged 事件没有触发。

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

更新 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 而不是 Event,这样您就可以直接在 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();
}

关于c# - WPF 组合框在值更改时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51443108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com