Ich könnte Hilfe verwenden, versuchen zu verstehen, wie die Befehle in Wpf mit Mvvm funktionieren und wie Sie eine Schaltfläche an sie binden. Habe viele Artikel über Befehle und WPF gelesen, aber sie scheinen alle unterschiedlich zu sein.Erstellen Sie einen Suchbefehl in WPF mit Mvvm, das neue Daten in meine Listenansicht lädt
Ich habe ein WPF-Projekt mit MVVM-Muster erstellt. Haben Sie eine Listenansicht, die mit Kunden gefüllt wird.
Jetzt möchte ich einen Suchbefehl machen, damit ich die Daten in der Listenansicht ändern kann.
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
}
Grundsätzlich laufe ich die LoadCustomerData() in der Ctor, und bekommt das Customer mit der get-Methode.
Ich versuche, einen Suchbefehl zu erstellen, der die andere Methode (CustomerDataLoadedOnSearch) ausführen wird, und dann den Aufruf erneut in der Ansicht auslösen.
XML-Ansicht Code:
<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>
Haben Sie einen Befehl namens SearchCommand binded. Jetzt bin ich mir nicht so sicher, was ich als nächstes tun soll. Soll ich einen Ordner mit dem Namen "Command" erstellen und alle Befehle dort für alle meine Buttons speichern?
Oder sollte ich den gesamten ICommand-Code im ViewModel behalten? Hoffe jemand kann mir zeigen, wie das geht.
Guten Tag.
Update:
Bisher Dank für Ihre replys.
Ich habe es geschafft, die ViewModelBase & RelayCommand-Klasse zu implementieren. Außerdem habe ich den Befehl der Suchschaltfläche implementiert, aber wenn ich darauf klicke, wird die Liste gelöscht (die Ansicht verliert ihre Kunden).
void SearchCommand_DoWork(object obj)
{
CustomerList.Clear();
CustomerList = CustomerDataLoadedOnSearch();
}
Haben die Customer debuggt und als ich die CustomerDataLoadedOnSearch nennen, haben es zwei Reihen mit neuen Kunden innen, aber die Liste hasen't besiedelt.
Verwenden Sie ein Framework, zum Beispiel mvvm light? – sexta13
Nein, habe 3 Ordner namens Models, ViewModels und Views gemacht :) Ist es viel einfacher mit Mvvm Licht? – Mikkel
Es wird Ihr Leben in einigen Punkten erleichtern. Du wirst einen IoC haben, einen Messenger haben um zu kommunizieren wenn nötig ... unter vielen anderen Dingen – sexta13