2017-04-26 4 views
0

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

+0

Was meinen Sie mit der Begrenzung der Elemente? Hast du irgendeinen Code ausprobiert? Diese Frage ist zu vage, um sie zu beantworten. – Simsons

+0

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]. –

+0

@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. –

Antwort

0

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.

+0

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 :) –

+0

@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. –

+0

Bereits versucht, Ihre Antwort zu verbessern, aber da mein Ruf weniger als 15 ist, wird es nicht angezeigt. –

0

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.

+0

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 :) –

Verwandte Themen