2017-04-26 3 views
0

두 개의 드롭 다운 A와 B가 있습니다. 드롭 다운 A에서 선택한 항목에 따라 B에 표시된 항목을 제한하고 싶습니다. Is xaml에 바인딩 할 수있는 속성이 있거나이를 구현하는 다른 방법이 있습니까? VS 2012, WPF, MVVM 모델 및 telerik 컨트롤을 사용하고 있습니다.다른 드롭 다운의 선택을 기반으로 한 드롭 다운의 항목 제한

+0

항목을 제한한다는 것은 무엇을 의미합니까? 코드를 해봤습니까? 이 질문은 대답하기에 너무 무리입니다. – Simsons

+0

몇 가지 코드를 작성하는 것처럼 보입니다. 대부분의 사용자는 곤경에 처한 코더 코드를 기꺼이 만들지 만 일반적으로 포스터가 이미 문제를 해결하려고 시도했을 때만 도움이됩니다. 이러한 노력을 입증하는 좋은 방법은 지금까지 작성한 코드, 예제 입력 (있는 경우), 예상 출력 및 실제로 얻은 출력 (콘솔 출력, 역 추적 등)을 포함시키는 것입니다. 더 자세하게 제공할수록 더 많은 답변을받을 수 있습니다. [FAQ]와 [ask]를 확인하십시오. –

+0

@PierreLebon 내 게시물을 다시 읽으면 xaml 및 viewmodel의 시나리오를 처리 할 때 지침을 찾고 있었지만 일부 코드를 제공해야합니다.부정적인 표시는 나에게 매우 정당하지 않은 것처럼 보였습니다.하지만 귀하가 제공 한 링크를 통해 간 것입니다. 어쨌든 귀하의 의견에 감사드립니다. –

답변

0

국가 콤보 상자의 선택에 따라 국가 콤보 상자가 채워지는 국가 및 국가 콤보 상자의 예제를 생각해 봅시다.

그래서 XAML 속성에 관해서는 국가 콤보 상자의 SelectedItem 속성에 따라 State 콤보 상자의 ItemsSource 속성을 업데이트하려고합니다.

이렇게하려면 국가 선택 상자를 선택하는 ViewModel에 "SelectedCountry"라는 새 속성을 추가하십시오. 이 "SelectedCountry"속성의 Setter에서 필요에 따라 StateCollection을 설정하십시오.

INotifyPropertyChanged 인터페이스를 구현하고 ObservableCollection 형식을 두 컬렉션 모두에 사용해야합니다.

모델 클래스 :

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; } 
} 

뷰 모델 :

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)); 
    } 

} 
,691 다음

동일한의 코드 샘플입니다

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(); 

나는이 예제는 당신을 위해 일을 명확하게되기를 바랍니다. 더 자세한 정보가 필요하면 알려주십시오.

+0

자세한 설명과 예제 코드를 가져 주셔서 감사합니다. 비록 내가 이미 그것을 구현하고 당신의 답을 지금 겪었지만, 저는 거의 변화가없는 솔루션과 거의 비슷한 방식으로 구현했습니다 (예를 들어, Setify에서 NotifyPropertyChanged 대신 RaisePropertyChanged를 사용했습니다. 데이터베이스에서 드롭 다운에 대한 데이터를 가져와야한다고 가정하고 프로 시저에서 논리를 구현하기로 결정했습니다. 당신은 당신의 코드를 가지고 나를 위해 몇 가지 더 많은 것을 명확히했습니다, 다시 한번 감사드립니다 :) –

+0

@VandanaChandola 내 대답이 어쨌든 당신을 도왔다 니 기쁘다! 그것을 upvote하시기 바랍니다 내 게시물이 귀하의 질문에 대답 있도록 이것이 다른 동료들에게 유용 할 수 있도록 답변을 표시하십시오. –

+0

이미 응답을 upvoting하려고했지만 내 평판이 15 미만이기 때문에 표시되지 않습니다. –

0

아이디어는 두 목록을 viewmodel에 추가하고 선택한 항목 (데이터 항목)을 보유하는 두 가지 속성을 갖는 것입니다.

두 개의 ComboBox를 해당 속성에 바인딩하고 'FirstSelectedItem'속성이 변경된 viewmodel 핸들 (또는 해당 설정자에 대한 항목)을 만듭니다.

그런 식으로 두 번째 목록의 구성원을 수정할 수 있습니다.

+0

예, 당신의 입력을 주셔서 감사합니다, 그것을 비슷한 구현했습니다 :) 두 번째 드롭 다운의 세터에서 첫 번째 드롭 다운의 선택한 항목을 제공하는 함수를 호출했습니다 매개 변수를 나머지 논리가 구현되는 프로 시저에 전달합니다. 그게 나를위한 일, 다시 한 번 고마워. :) –

관련 문제