2016-12-05 6 views
-1

WPFアプリケーション開発の初心者です。私はブロックに基づいて床を取得したい。ブロックのコンボボックスとフロアのコンボボックスがあります。あるコンボボックスでブロックを選択すると、もう一方のコンボボックスには選択ブロックのフロアが表示されます。 これは、コンボボックスのレイアウトです:別のコンボボックスの値に基づいて1つのコンボボックス値を選択します。

enter image description here

<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

あなたは、私はMVVMを使用して、とても親切に私に答えています 'Selector_OnSelectionChanged()' –

+0

ます。private void Selector_OnSelectionChanged(オブジェクト送信者、SelectionChangedEventArgs E) { } – 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

はここで若干異なる例です。

<!-- 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 ... ...適切な何かのためのcase文アウト

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モデルの間にマスター - ディテール関係を確立し、ビュー(コンボボックス)に正しくバインドする必要があります。

は、だからあなたのFloorBlockは二つの性質IDDescriptionを持っていると仮定、あなたのモデルは次のようになります。

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は、現在選択されているブロックを格納するために2 ObservableCollection sおよびつのプロパティが含まれます。通知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}" /> 
関連する問題