Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 值更改时,WPF组合框不会更新_C#_Wpf_Entity Framework_Mvvm_Viewmodel - Fatal编程技术网

C# 值更改时,WPF组合框不会更新

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

我有一个带有组合框和按钮的WPF应用程序。在我将值输入textbox并按下按钮后,textbox中的值应该出现在combobox的更新列表中。我正试图通过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));
            }
        }
以下是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();
    }