2016-12-05 1 views
-1

WPF 응용 프로그램 개발을 처음 사용합니다. 블록을 기준으로 바닥을 얻고 싶습니다. 하나의 블록 콤보 상자와 다른 콤보 상자가 있습니다. 한 콤보 상자에서 블록을 선택하면 다른 콤보 상자에 선택 블록의 바닥이 표시됩니다.다른 콤보 상자 값을 기준으로 하나의 콤보 상자 값을 선택하십시오.

<ComboBox Grid.Row="0" Grid.Column="0" Width="100" 
      Margin="0,0,0,10" Height="35" 
      Loaded="FrameworkElement_OnLoaded" 
      SelectedValuePath ="Id" 
      SelectedValue ="{Binding SelectedBlockId, Mode=TwoWay}" 
      DisplayMemberPath="Name" 
      SelectionChanged="Selector_OnSelectionChanged" ItemsSource="{Binding Blocks}" /> 

<ComboBox Grid.Row="0" Grid.Column="3" Width="100" 
      Margin="0,0,0,10" Height="35" 
      Loaded="FrameworkElement_OnLoaded" 
      SelectedValuePath ="Id" 
      SelectedValue ="{Binding SelectedFloorId, Mode=TwoWay}" 
      DisplayMemberPath="Name" 
      SelectionChanged="Selector_OnSelectionChanged" ItemsSource="{Binding Floors}" /> 
+0

이 보인다'Selector_OnSelectionChanged은()' –

+0

개인 무효 Selector_OnSelectionChanged (개체를 보낸 사람, SelectionChangedEventArgs 전자) { } 내가 MVVM을 사용하고 – Zeeshan194

답변

-1

MVVM 패턴을 사용하여 WPF에서 계단식 선택 상자를 구현하는 방법의 예를 들면 다음 블로그 게시물을 참조하십시오 : https://blog.magnusmontin.net/2013/06/17/cascading-comboboxes-in-wpf-using-mvvm/

기본적으로 국가 및 도시 유형을 샘플 코드의 블록 및 바닥 유형으로 바꿀 수 있습니다. 당신이 좋아 .... 귀하의 질문에 대한 몇 가지 코드를 놓치고처럼

+0

스택 오버플로에 오신 것을 환영합니다! 이것은 경계선 [링크 전용 답변] (http://meta.stackexchange.com/q/8231/213671)입니다. 여기에 많은 정보를 포함 시키려면 답을 넓히고 참고 용으로 만 링크를 사용해야합니다. –

0

enter image description here은 여기에 약간 다른 예입니다 : 이 콤보 상자의 레이아웃입니다.

<!-- language: xaml --> 
<Label Name="FavoriteFoodLbl" Grid.Column="0" Grid.Row="13">Favorite Food</Label> 
<ComboBox Name="FavoriteFoodCombo" Grid.Column="1" Grid.Row="13" ItemsSource="{Binding Foods}" SelectedItem="{Binding FavoriteFood, UpdateSourceTrigger=PropertyChanged}" /> 

<Label Name="FavoriteFlavourLbl" Grid.Column="2" Grid.Row="13">Favorite Flavour</Label> 
<ComboBox Name="FavoriteFlavourCombo" Grid.Column="3" Grid.Row="13" ItemsSource="{Binding Flavours}" /> 

보기 모델/코드 숨김 코드

XAML ... ... 적절한 뭔가의 경우 문 밖으로

public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<string> Foods { get; set; } = new ObservableCollection<string>() { "Pizza", "Ice Cream", "Soup" }; 

    private string _favoriteFood; 
    public string FavoriteFood 
    { 
     get { return _favoriteFood; } 
     set 
     { 
      _favoriteFood = value; 
      switch (_favoriteFood) 
      { 
       case "Pizza": 
        _flavours = new ObservableCollection<string>(PizzaToppings); 
        break; 
       case "Ice Cream": 
        _flavours = new ObservableCollection<string>(IceCreamFlavours); 
        break; 
       case "Soup": 
        _flavours = new ObservableCollection<string>(SoupFlavours); 
        break; 
       default: 
        _flavours = new ObservableCollection<string>(); 
        break; 
      } 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("FavoriteFood")); 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Flavours")); 
     } 
    } 

    public List<string> PizzaToppings { get; set; } = new List<string>() { "Margarita", "Pepperoni", "Meat Feast" }; 
    public List<string> IceCreamFlavours { get; set; } = new List<string>() { "Vanilla", "Strawberry", "Chocolate" }; 
    public List<string> SoupFlavours { get; set; } = new List<string>() { "Tomato", "Leek and Potato", "Chicken" }; 

    private ObservableCollection<string> _flavours = null; 
    public ObservableCollection<string> Flavours 
    { 
     get 
     { 
      return _flavours; 
     } 
     set 
     { 
      _flavours = value; 
      RaisePropertyChanged(); 
     } 
    } 
    public string FavoriteFlavour { get; set; } 

변경합니다. 도움이 되나요?

+0

, 너무 친절하게 대답 MVVM 아키텍처에 따라 – Zeeshan194

+0

해당 코드가 뷰 모델에서 작동해야합니다. 그렇지 않습니까? –

0

당신이해야 할 일은 BlockFloor 모델 사이의 마스터 - 세부 관계를 설정하고 뷰 (콤보 박스)에 올바르게 바인딩하는 것입니다.

public class Floor 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

public class Block 
{ 
    public int Id { get; set; } 
    public int Description { get; set; } 
    // notice Floors collection inside each block 
    public IList<Floor> Floors { get; set; } 

    public Block() 
    { 
     Floors = new List<Floor>(); 
    } 
} 

귀하의 ViewModel 현재 선택된 블록을 저장하는 두 ObservableCollection의 한 속성을 포함합니다 :

그래서 FloorBlock이 두 가지 속성 IDDescription, 모델은 다음과 같이해야이 당신의 랬. 알림 SelectedBlock 속성 설정자 : 속성이 업데이트되면 Floors 컬렉션이 새 값으로 다시 만들어집니다. 당신의 XAML에서

public const string BlocksPropertyName = "Blocks"; 
private ObservableCollection<Block> _blocks = null; 
public ObservableCollection<Block> Blocks 
{ 
    get 
    { 
     return _blocks; 
    } 
    set 
    { 
     _blocks = value; 
     RaisePropertyChanged(BlocksPropertyName); 
    } 
} 

public const string SelectedBlockPropertyName = "SelectedBlock"; 
private Block _selectedBlock = null; 
public Block SelectedBlock 
{ 
    get 
    { 
     return _selectedBlock; 
    } 
    set 
    { 
     _selectedBlock = value; 
     RaisePropertyChanged(SelectedBlockPropertyName); 

     if (_selectedBlock != null) 
     { 
      Floors = new ObservableCollection<Floor>(_selectedBlock.Floors); 
     } 
    } 
} 

public const string FloorsPropertyName = "Floors"; 
private ObservableCollection<Floor> _floors = null; 
public ObservableCollection<Floor> Floors 
{ 
    get 
    { 
     return _floors; 
    } 
    set 
    { 
     _floors = value; 
     RaisePropertyChanged(FloorsPropertyName); 
    } 
} 

당신은 corrispective 컬렉션에 모두 선택 상자를 바인딩 :

<ComboBox ItemsSource="{Binding Blocks}" 
      SelectedItem="{Binding SelectedBlock}" /> 

<ComboBox ItemsSource="{Binding Floors}" /> 
관련 문제