Создайте SearchCommand в wpf, используя Mvvm, который загружает новые данные в мой список
Я мог бы использовать некоторую помощь, пытаясь понять, как команды работают в Wpf с Mvvm и как вы привязываете к нему кнопку. Прочитал много статей о командах и wpf, но все они кажутся разными.
Я создал проект wpf, используя шаблон mvvm. Имейте представление списка, которое будет заполнено клиентами.
Теперь я хочу сделать команду поиска, чтобы я мог изменить данные в виде списка.
CustomerViewModel
public class CustomerViewModel : INotifyPropertyChanged, ICommand
{
private List<Customer> CustomerList;
public CustomerViewModel()
{
CustomerList = LoadCustomerData();
}
public List<Customer> LoadCustomerData()
{
List<Customer> data = new List<Customer>();
data.Add(new Customer() { Id = 1, FirstName = "Alexander", LastName = "Malkovich", PhoneNumber = "43215678", Email = "[email protected]" });
data.Add(new Customer() { Id = 2, FirstName = "Mikkel", LastName = "Larsen", PhoneNumber = "87654321", Email = "[email protected]" });
return data;
}
public List<Customer> CustomerDataLoadedOnSearch()
{
List<Customer> data = new List<Customer>();
data.Add(new Customer() { Id = 1, FirstName = "Ulrik", LastName = "Trissel", PhoneNumber = "35325235", Email = "[email protected]" });
data.Add(new Customer() { Id = 2, FirstName = "Michael", LastName = "Mortensen", PhoneNumber = "14214124", Email = "[email protected]" });
return data;
}
public List<Customer> Customer
{
get
{
return CustomerList;
}
}
// Search Command
#region INotifyPropertyChanged members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
По сути, я запускаю LoadCustomerData () в ctor и получаю CustomerList с помощью метода get.
Я пытаюсь создать команду поиска, которая запустит другой метод (CustomerDataLoadedOnSearch), а затем снова вызовет вызов get в представлении.
XML-код представления:
<StackPanel Orientation="Vertical">
<Button Command="{Binding SearchCommand}" Padding="15, 5" HorizontalAlignment="Right">Search</Button>
</StackPanel>
<GroupBox Header="Customers">
<StackPanel Margin="10, 10" Orientation="Vertical">
<ListView Height="250" Width="Auto" ItemsSource="{Binding Customer}" Grid.Row="1">
<ListView.View>
<GridView >
<GridViewColumn Header="ID" Width="Auto">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Id}" TextAlignment="Right" Width="40"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding FirstName}" Header="First name" Width="100"/>
<GridViewColumn DisplayMemberBinding="{Binding LastName}" Header="Last name" Width="100"/>
<GridViewColumn DisplayMemberBinding="{Binding PhoneNumber}" Header="Phone" Width="100"/>
<GridViewColumn DisplayMemberBinding="{Binding Email}" Header="Email" Width="200"/>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</GroupBox>
Связали команду под названием SearchCommand. Теперь я не уверен, что делать дальше. Должен ли я создать папку с именем Command и сохранить все команды для всех моих кнопок, которые я делаю?
Или я должен хранить весь код ICommand во ViewModel? Надеюсь, кто-то может показать мне, как это работает.
Добрый день.
Обновить:
Пока спасибо за ваши ответы.
Мне удалось реализовать класс ViewModelBase & RelayCommand. Кроме того, я реализовал Icommand кнопки поиска, но когда я нажимаю на нее, она очищает список (представление теряет своих клиентов).
void SearchCommand_DoWork(object obj)
{
CustomerList.Clear();
CustomerList = CustomerDataLoadedOnSearch();
}
Отладка CustomerList, и когда я вызываю CustomerDataLoadedOnSearch, у него есть две строки с новыми клиентами внутри, но список не заполнен.