Wie kann ich mit mehreren Checkboxen in das MVVM-pattern?
Bindung checkbox in WPF ist häufiges Problem, aber ich bin immer noch nicht finden, Beispiel-code, die leicht zu Folgen für Anfänger. Ich habe das Kontrollkästchen Liste im WPF-wählen Sie Lieblings-Sport' Namen. Die Anzahl der Checkboxen ist statisch in meinem Fall. Kann jemand mir zeigen, wie zu implementieren ViewModel für dieses Problem?
FavoriteSportsView.xaml:
<StackPanel Height="50" HorizontalAlignment="Left" VerticalAlignment="Top"
Width="150">
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"
Command="{Binding Path=SportsResponseCommand}"
CommandParameter="Football"
Content="Football"
Margin="5" />
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"
Command="{Binding Path=SportsResponseCommand}"
CommandParameter="Hockey"
Content="Hockey"
Margin="5" />
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}"
Command="{Binding Path=SportsResponseCommand}"
CommandParameter="Golf"
Content="Golf"
Margin="5" />
</StackPanel>
FavoriteSportsViewModel.cs
public class FavoriteSportsViewModel.cs {
//Since I am using the same IsChecked in all check box options, I found all check
//boxes gets either checked or unchecked when I just check or uncheck one option.
//How do i resolve this issue? I don't think i need seprate IsChecked for each
//check box option.
private bool _isChecked;
public bool IsChecked{
get {
return _isChecked;
}
set { if (value != _isChecked)
_isChecked = value;
this.OnPropertyChanged("IsChecked");
}
}
//How do i detect parameter in this method?
private ICommand _sportsResponseCommand;
public ICommand SportsResponseCommand
{
get
{
if (_sportsResponseCommand== null)
_sportsResponseCommand= new
RelayCommand(a => DoCollectSelectedGames(), p => true);
return _sportsResponseCommand;
}
set
{
_sportsResponseCommand= value;
}
}
private void DoCollectSelectedGames(){
//Here i push all selected games in an array
}
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Ich bin mir nicht sicher, wie Sie die folgenden im oben ViewModel:
1. Wie implementiere ich eine einzige Methode, um alle meine Optionen?
2. wie erkenne ich die jeweils eines der Kontrollkästchen, um zu sehen, ob geprüft oder nicht
3. Wie kann ich utlize CommandParameter?
4. Wie implementiere ich SportsResponseCommand richtig
- Ist über eine checkbox-Liste eine option für dich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich empfehle Ihnen, Lesen Sie dieses http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Ich beschreibe eine Lösung, die weiter unten versuchte ich, nicht ändern Sie Ihre XAML-code, aber es ist nicht der einzige Weg (oder der beste Ansatz ist), sondern enthält alle notwendigen Elemente!
Im ersten Schritt müssen Sie Ihr Modell-ich nenne es Model_Sport
Nun müssen Sie einen Weg, um zu delegieren, Ihren Befehl "SportsResponseCommand", DelegateCommand Objekt wird Ihnen helfen, das zu tun,
Nun "ViewModel"
Jetzt Anzeigen
Denken Sie daran, datacontext für Ihre Fenster
public MainWindow()
{
Dann in XAML
Ihre view-Modell sollte wie folgt Aussehen:
Dann verbinden Sie Ihre Ansicht Modell mit dem Blick durch die Einstellung der
DataContext
Eigenschaft (hier wird vermutlich in derWindow
oderUserControl
code dahinter, aber es gibt eine Menge von Möglichkeiten, dies zu erreichen).Schließlich, aktualisieren Sie Ihre Bindungen so, dass Sie Aussehen wie:
Als eine Letzte Bemerkung, Sie sollten nicht wirklich brauchen, zu binden
Command
Eigenschaft - Sie kann nur schreiben, was code, den Sie ausführen müssen, um in die Eigenschaft setter-Ansicht auf das Modell.Wenn Sie wollen einfach nur eine Eigenschaft in das ViewModel zu erhalten, aktualisiert, wenn die
IsChecked
änderungen ersetzen die Bindung zu einem boolean IsChecked-Eigenschaft in der ViewModel, das wirftNotifyPropertyChanged
auf "set".Nun, wenn Sie eine Aktion durchführen möchten, jedesmal, wenn IsChecked änderungen für eine der 3 Checkboxen:
Erstens, ersetzen Sie Ihre CommandParameter mit
"{Binding RelativeSource={RelativeSource Mode=Self}}"
In der ViewModel (das sollte INotifyPropertyChanged implementieren), erstellen Sie eine ICommand - (SportsResponseCommand), das dauert ein Kontrollkästchen parameter.
In das Kommando der Methode, überprüfen Sie den Inhalt Ihres "CheckBox" und für die "IsChecked-Eigenschaft" dann machen Sie Ihre Sachen mit Ihnen.
Wenn Sie weitere Fragen haben lass es mich wissen.
Können Sie einen Blick Modell durch die Nutzung dieser
dann können Sie implementieren Binding in XAML als
<CheckBox IsChecked="{Binding Football, Mode=TwoWay}"
Command="{Binding Path=SportsResponseCommand}"
CommandParameter="Football"
Content="Football"
Margin="5" />
<CheckBox IsChecked="{Binding Golf, Mode=TwoWay}"
Command="{Binding Path=SportsResponseCommand}"
CommandParameter="Football"
Content="Football"
Margin="5" />