![](/img/trans.png)
[英]ComboBox items not updating when underlying ObservableCollection changes
[英]ComboBox not updating when ObservableCollection is modified in another View
我正在從事一個用於實踐目的的MVVM WPF小項目,我有兩個窗口,每個窗口一個視圖,一個窗口用於顯示員工( MainWindow
),一個用於添加員工( AddPersonWindow
)。
在我的MainWindow中,有一個綁定到ObservableCollection的ComboBox,我可以從MainWindow
的按鈕打開AddPersonWindow
。 但是,如果我通過單擊保存按鈕並執行AddPerson()
函數將員工從AddPersonWindow
添加到ObservableCollection,則MainWindow中的ComboBox不會更新。 如果我從MainWindow
執行完全相同的AddPerson()
函數,則一切都很好,並且ComboBox顯示了新條目。 我在這里想念什么?
碼:
人.cs
class Person
{
public string Surname { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public string HouseNumber { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
public string PhoneAreaCode { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
public string FullName { get { return String.Format("{0}, {1}", Name, Surname); } }
}
PersonViewModel.cs
class PersonViewModel : INotifyPropertyChanged
{
public CommandHandler ButtonClick { get; set; }
public PersonViewModel()
{
CreatePerson();
}
//Combobox SelectedItem
private Person _selectedPerson;
public Person SelectedPerson
{
get { return _selectedPerson; }
set
{
_selectedPerson = value;
OnPropertyChanged("SelectedPerson");
}
}
public ObservableCollection<Person> PersonList { get; set; } = new ObservableCollection<Person>();
public void CreatePerson()
{
foreach (string line in File.ReadLines(@"C:\some_file.csv", Encoding.GetEncoding("iso-8859-1")))
{
string[] substrings = line.Split(',');
Person person = new Person {
Surname = substrings[0],
Name = substrings[1],
Street = substrings[2],
HouseNumber = substrings[3],
PostalCode = substrings[4],
City = substrings[5],
PhoneAreaCode = substrings[6],
PhoneNumber = substrings[7],
Email = substrings[8] };
PersonList.Add(person);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
AddPersonViewModel.cs
class AddPersonViewModel : PersonViewModel
{
public AddPersonViewModel()
{
ButtonClick = new CommandHandler(AddPerson);
}
public string EnteredSurname { get; set; }
public string EnteredName { get; set; }
public string EnteredStreet { get; set; }
public string EnteredHouseNumber { get; set; }
public string EnteredPostalCode { get; set; }
public string EnteredCity { get; set; }
public string EnteredPhoneAreaCode { get; set; }
public string EnteredPhoneNumber { get; set; }
public string EnteredEmail { get; set; }
public void AddPerson()
{
Person person = new Person
{
Surname = EnteredSurname,
Name = EnteredName,
Street = EnteredStreet,
HouseNumber = EnteredHouseNumber,
PostalCode = EnteredPostalCode,
City = EnteredCity,
PhoneAreaCode = EnteredPhoneAreaCode,
PhoneNumber = EnteredPhoneNumber,
Email = EnteredEmail
};
PersonList.Add(person);
}
}
CommandHandler.cs
class CommandHandler : ICommand
{
Action ExecuteHandler;
public CommandHandler(Action executeHandler)
{
ExecuteHandler = executeHandler;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
ExecuteHandler();
}
}
MainWindow.xaml.cs:
public MainWindow()
{
InitializeComponent();
DataContext = new PersonViewModel();
}
AddPersonWindow.xaml.cs:
public AddPersonWindow()
{
InitializeComponent();
DataContext = new AddPersonViewModel();
}
MainWindow.xaml中的ComboBox:
<ComboBox Width="325" HorizontalAlignment="Left" Margin="7" Grid.Column="1" ItemsSource="{Binding PersonList}" DisplayMemberPath="FullName" SelectedItem="{Binding SelectedPerson}" IsTextSearchEnabled="True" TextSearch.TextPath="FullName" IsEditable="True" />
AddPersonWindow.xaml中的按鈕:
<Button Width="100" Height="30" Margin="15" Grid.Row="3" Grid.Column="2" HorizontalAlignment="Right" IsEnabled="True" Command="{Binding ButtonClick}">Speichern</Button>
我沒有設法在兩個視圖模型之間共享一個PersonList
實例,因此我決定直接在AddPersonViewModel
編輯基礎CSV文件:
class AddPersonViewModel
{
public CommandHandler ButtonClick { get; set; }
public AddPersonViewModel()
{
ButtonClick = new CommandHandler(AddPerson);
}
public string EnteredSurname { get; set; }
public string EnteredName { get; set; }
public string EnteredStreet { get; set; }
public string EnteredHouseNumber { get; set; }
public string EnteredPostalCode { get; set; }
public string EnteredCity { get; set; }
public string EnteredPhoneAreaCode { get; set; }
public string EnteredPhoneNumber { get; set; }
public string EnteredEmail { get; set; }
void AddPerson()
{
File.AppendAllText(@"C:\some_file.csv", "\r\n" +
EnteredSurname + "," +
EnteredName + "," +
EnteredStreet + "," +
EnteredHouseNumber + "," +
EnteredPostalCode + "," +
EnteredCity + "," +
EnteredPhoneAreaCode + "," +
EnteredPhoneNumber + "," +
EnteredEmail,
Encoding.GetEncoding("iso-8859-1")
);
}
}
}
為了在另一個視圖中添加一個人之后刷新PersonViewModel
類視圖中的ComboBox,我實現了一種方法,該方法可以通過單擊按鈕來執行。 為此,我使用follwoing方法:
public void RefreshPersons()
{
PersonList.Clear();
foreach (string line in File.ReadLines(@"C:\Users\c.philipp\Downloads\adressbuch.csv", Encoding.GetEncoding("iso-8859-1")))
{
string[] substrings = line.Split(',');
Person person = new Person
{
Surname = substrings[0],
Name = substrings[1],
Street = substrings[2],
HouseNumber = substrings[3],
PostalCode = substrings[4],
City = substrings[5],
PhoneAreaCode = substrings[6],
PhoneNumber = substrings[7],
Email = substrings[8]
};
PersonList.Add(person);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.