Ich habe zwei Dropdown-Menüs A und B. Abhängig von der Auswahl in Dropdown A möchte ich die in B gezeigten Elemente einschränken gibt es eine Eigenschaft, die ich in XAML binden kann oder gibt es eine andere Möglichkeit, es zu erreichen? Ich benutze VS 2012, WPF, MVVM Modell und Telerik Kontrollen.Einschränkung von Elementen in einem Dropdown-Menü basierend auf der Auswahl in einem anderen Dropdown-Feld
Antwort
Betrachten wir das Beispiel des Kombinationsfelds "Land und Staat", in dem das Status-Kombinationsfeld entsprechend der Auswahl im Kombinationsfeld "Land" ausgefüllt wird.
Wenn ich also in XAML-Eigenschaften spreche, möchten Sie hier die ItemsSource-Eigenschaft des Kombinationsfelds State auf der Basis der SelectedItem-Eigenschaft des Country-Kombinationsfelds aktualisieren.
Um dies zu erreichen, fügen Sie in ViewModel eine neue Eigenschaft "SelectedCountry" hinzu, die die Auswahl des Kombinationsfelds Country enthält. Legen Sie StateCollection im Setter dieser Eigenschaft "SelectedCountry" nach Bedarf fest.
Stellen Sie sicher, dass Sie die INotifyPropertyChanged-Schnittstelle implementieren und den ObservableCollection-Typ für beide Sammlungen verwenden.
Folgende ist die Code-Beispiel für das gleiche:
Modellklassen:
public class Country
{
public string CountryName { get; set; }
public int CountryId { get; set; }
public List<State> States { get; set; }
}
public class State
{
public string StateName { get; set; }
public int StateId { get; set; }
}
Ansichtsmodell:
public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
CountriesCollection = new ObservableCollection<Country>();
StateCollection = new ObservableCollection<State>();
LoadData();
}
private ObservableCollection<Country> _CountriesCollection;
public ObservableCollection<Country> CountriesCollection
{
get { return _CountriesCollection; }
set
{
_CountriesCollection = value;
NotifyPropertyChanged("CountriesCollection");
}
}
private ObservableCollection<State> _StatesCollection;
public ObservableCollection<State> StateCollection
{
get { return _StatesCollection; }
set
{
_StatesCollection = value;
NotifyPropertyChanged("StateCollection");
}
}
private Country _SelectedCountry;
public Country SelectedCountry
{
get { return _SelectedCountry; }
set
{
_SelectedCountry = value;
if (_SelectedCountry != null && _SelectedCountry.States != null)
{
StateCollection = new ObservableCollection<State>(_SelectedCountry.States);
}
NotifyPropertyChanged("SelectedCountry");
}
}
private void LoadData()
{
if (CountriesCollection != null)
{
CountriesCollection.Add(new Country
{
CountryId = 1,
CountryName = "India",
States = new List<State>
{
new State { StateId = 1, StateName = "Gujarat"},
new State { StateId = 2, StateName = "Punjab"},
new State { StateId = 3, StateName = "Maharastra"}
}
});
CountriesCollection.Add(new Country
{
CountryId = 2,
CountryName = "Chine",
States = new List<State>
{
new State { StateId = 4, StateName = "Chine_State1"},
new State { StateId = 5, StateName = "Chine_State2"},
new State { StateId = 6, StateName = "Chine_State3"}
}
});
CountriesCollection.Add(new Country
{
CountryId = 3,
CountryName = "japan",
States = new List<State>
{
new State { StateId = 7, StateName = "Japan_State1"},
new State { StateId = 8, StateName = "Japan_State2"},
new State { StateId = 9, StateName = "Japan_State3"}
}
});
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
}
}
XALM:
<StackPanel Orientation="Horizontal" >
<ComboBox
Height="30" Width="100"
HorizontalAlignment="Left" Margin="30"
ItemsSource="{Binding CountriesCollection}"
SelectedItem="{Binding SelectedCountry}"
DisplayMemberPath="CountryName">
</ComboBox>
<ComboBox
Height="30" Width="100"
HorizontalAlignment="Left" Margin="30"
ItemsSource="{Binding SelectedCountry.States}"
DisplayMemberPath="StateName">
</ComboBox>
</StackPanel>
XAML.CS
InitializeComponent();
this.DataContext = new MainWindowViewModel();
Ich hoffe, dass dieses Beispiel werden die Dinge klar für Sie. Lassen Sie es mich wissen, wenn Sie weitere Informationen dazu benötigen.
Danke für die ausführliche Erklärung und Beispielcode. Obwohl ich es bereits implementiert habe und Ihre Antwort erst jetzt durchging, habe ich es auf ähnliche Weise implementiert wie Ihre Lösung mit nur ein paar Änderungen (so wie ich RaisePropertyChanged statt NotifyPropertyChanged im Setter verwendet habe und seit Ich sollte Daten für das Dropdown von der Datenbank holen, ich entschied mich, die Logik dafür in der Prozedur zu implementieren). Du hast mit deinem Code ein paar weitere Dinge für mich geklärt, danke nochmal :) –
@VandanaChandola Froh, dass meine Antwort dir trotzdem geholfen hat! Bitte upvote es und markieren Sie es als Antwort, wenn mein Beitrag Ihre Frage beantwortet, so dass dies auch für andere Kollegen in Zukunft nützlich sein könnte. –
Bereits versucht, Ihre Antwort zu verbessern, aber da mein Ruf weniger als 15 ist, wird es nicht angezeigt. –
Die Idee besteht darin, beide Liste im Viewmodel plus zwei Eigenschaften zu haben, um das ausgewählte Element (Datenelement) zu halten.
Lassen Sie die beiden ComboBox an diese Eigenschaften binden und im Viewmodel die 'FirstSelectedItem'-Eigenschaft ändern (oder den Eintrag zu ihrem Setter).
Auf diese Weise können Sie die Mitglieder der zweiten Liste ändern.
ja danke für deine Eingabe, ich habe es ähnlich umgesetzt :) Im Setter des zweiten Dropdown habe ich eine Funktion aufgerufen, die das ausgewählte Element des ersten Dropdowns als anbietet Parameter zu einer Prozedur, in der der Rest der Logik implementiert ist. Das macht die Arbeit für mich, danke nochmal :) –
- 1. Auswahl der Datenbanktechnologie basierend auf einem Anwendungsfall
- 2. Multi-Auswahl basierend auf einem anderen Multi-Select
- 3. Anzeigefeld basierend auf einem anderen in JointJS
- 4. basierend auf den Werten in einem anderen
- 5. Bash: Löschen von Elementen in einem Array aus einem anderen
- 6. auf Arrays basierend auf Namen von Elementen in einem anderen Array Hinzufügen
- 7. Auswahl eines Bereichs von Elementen in einem Array in C#
- 8. Auswahl in einem Widget basierend auf einer Auswahl in einem Template-Widget (JS getriggert)
- 9. Filter Auswahl Optionen basierend auf anderen Auswahl
- 10. Ersetze Werte in einem Vektor basierend auf einem anderen Vektor
- 11. Django - Filterformularfeldsatz basierend auf einem anderen Feld
- 12. Ändern der URL basierend auf einem anderen Link in jQuery
- 13. 3 dropdown Füllen basierend auf der Auswahl in einem anderen [Cascading dropdown]
- 14. JQuery Disabled Dropdown-Optionen basierend auf der Auswahl von einem anderen
- 15. Ajax wählen basierend auf einem anderen wählen
- 16. Der ausgewählte Wert in einem Dropdown sollte nicht in einem anderen Dropdownfeld angezeigt werden. Wie entferne ich das ausgewählte Element?
- 17. Kopieren von Elementen von einem Zeichen-Array zu einem anderen
- 18. Löschen von Elementen aus einer Karte basierend auf einem Zustand
- 19. Hinzufügen von Elementen in einem anderen DOM-Element in MooTools
- 20. Populate Spinner basierend auf Auswahl in anderen Spinnern
- 21. Einschränkung der Bildlauffunktion auf HTML5-Canvas-Elementen
- 22. Kopieren von Dateien basierend auf einem Zeitstempelwert in einem Dateinamen
- 23. Maximalwert basierend auf einem anderen Eingang setzen
- 24. löschen Vektoreinträge basierend auf einem anderen Vektor
- 25. Variable in ng-style basierend auf anderen DOM-Elementen verwenden
- 26. Modellattribut basierend auf einem anderen Attribut
- 27. Canvas Position basierend auf einem anderen Element
- 28. Pandas: Hinzufügen einer neuen Spalte in einem Datenrahmen basierend auf einem Wert in einem anderen Datenrahmen
- 29. Einschränken von XML-Elementen basierend auf einem anderen Element über XSD
- 30. assign Select basierend auf einem anderen
Was meinen Sie mit der Begrenzung der Elemente? Hast du irgendeinen Code ausprobiert? Diese Frage ist zu vage, um sie zu beantworten. – Simsons
Es sieht so aus, als wollten Sie, dass wir einen Code für Sie schreiben. Während viele Benutzer bereit sind, Code für einen in Not geratenen Coder zu produzieren, helfen sie normalerweise nur, wenn das Poster bereits versucht hat, das Problem selbst zu lösen. Eine gute Möglichkeit, diesen Aufwand zu demonstrieren, besteht darin, den Code, den Sie bisher geschrieben haben, die Beispieleingabe (falls vorhanden), die erwartete Ausgabe und die Ausgabe, die Sie tatsächlich erhalten (Konsolenausgabe, Trace-Backs usw.), einzubeziehen. Je mehr Details Sie angeben, desto mehr Antworten erhalten Sie wahrscheinlich. Überprüfen Sie die [FAQ] und [fragen]. –
@PierreLebon Wenn ich meinen Beitrag noch einmal durchlese, scheint es so zu sein und ich hätte etwas Code zur Verfügung stellen sollen, obwohl ich nach einer Anleitung für die Bearbeitung des Szenarios in xaml und viewmodel gesucht habe.Die negative Bewertung erscheint mir nicht sehr gerechtfertigt, aber ich habe die von Ihnen bereitgestellten Links durchgesehen und bedanke mich für Ihr Feedback. –