2016-12-05 140 views
-1

我是WPF应用程序开发的新手。我想根据块来获取楼层。我有一个组合框的块和另一个组合框的地板。当我在一个组合框中选择任何块时,另一个组合框应显示选择块的楼层。 这是组合框布局:基于另一个组合框值选择一个组合框值

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

好像你错过了你的问题的一些代码....像'Selector_OnSelectionChanged()' –

+0

私人无效Selector_OnSelectionChanged(对象发件人,SelectionChangedEventArgs E) { } – Zeeshan194

回答

-1

请参考下面的博客文章,了解如何使用MVVM模式来实现在WPF级联组合框的例子:https://blog.magnusmontin.net/2013/06/17/cascading-comboboxes-in-wpf-using-mvvm/

你基本上可以用你的Block和Floor类型代替示例代码中的Countries和Cities类型。

+0

欢迎来到Stack Overflow!这是一个边界[仅限链接的答案](http://meta.stackexchange.com/q/8231/213671)。你应该扩大你的答案,在这里包含尽可能多的信息,并使用链接仅供参考。 –

0

这里有一个稍微不同的例子。

XAML中...

<!-- 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}" /> 

视图模型/后台代码...

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,所以恳请答复我根据MVVM架构 – Zeeshan194

+0

该代码应该在您的视图模型中工作。不是吗? –

0

您需要做的是建立BlockFloor模型之间的主从关系,并将它们正确绑定到您View(组合框)。

所以假设你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>(); 
    } 
} 

您的视图模型包含两个ObservableCollection S和一个属性来存储当前选定的区块。注意SelectedBlock属性设置器:当属性更新时,Floors集合将被重新创建为新值。

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

在XAML中你只是两个组合框绑定到corrispective集合:

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

<ComboBox ItemsSource="{Binding Floors}" /> 
相关问题