WPF中相互关联的组合框

时间:2015-06-16 10:41:56

标签: wpf user-interface combobox wpf-controls database-connectivity

我在我的项目中使用WPF C#。 我的UI包含4个组合框,每个组合框都将由数据库中的值加载。 现在一次显示所有4个组合框。 但我想要做的是,第一个组合框1应该是可见/显示然后用户选择一个值,例如val1,然后第二个组合框应该是可见的,它应该包含基于在combobox1中选择的val1的值(来自数据库),以及等等。 组合框应与之前的组合框相互关联。

如何在WPF中完成此任务?

一些XAML代码:                                                                                                                                                              请选择:

    <Label Grid.Row="1">combobox1 :</Label>
    <ComboBox  Name="PL" Grid.Row="1" Grid.Column="1" Loaded="ComboBox_PLLoaded" SelectionChanged="ComboBox_PLSelectionChanged" />

    <Label Grid.Row="2" HorizontalAlignment="Right">combobox2:</Label>
    <ComboBox Name="Re" Grid.Row="2" Grid.Column="1" VerticalAlignment="Top"  Loaded="ComboBox_RCLoaded" SelectionChanged="ComboBox_RCSelectionChanged"/>

    <Label Grid.Row="3" Margin="89.216,0,60.581,26" Grid.RowSpan="2">combobox3 :</Label>
    <ComboBox Name="CT" Grid.Row="3" Grid.Column="1" Loaded="ComboBox_RCLoaded" SelectionChanged="ComboBox_RCSelectionChanged"/>

    <Label Grid.Row="4" HorizontalAlignment="Right">combobox4 :</Label>
    <ComboBox Name="PT" Grid.Row="4" Grid.Column="1" />

   </Grid>

2 个答案:

答案 0 :(得分:0)

您可以使用BooleanToVisibilityConverter Class在代码隐藏或视图模型中显示和隐藏各种MultiValueMap es以及多个public class MyRecyclerAdapter extends Adapter<RecyclerAdapter.ViewHolder> { private ItemType[] mItems; private MRAItemClickedListener mListener; public MyRecyclerAdapter(Context ctx, MRAItemClickedListener listener){ mListener = listener; ... } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.itemView.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { mListener.onItemClicked(mItems[position]); } }); } interface MRAItemClickedListener { void onItemClicked(ItemType item); } } public class MyFragment ... implements MRAItemClickedListener { public void onItemClicked(ItemType item){ // do stuff with item } } 属性。您可以从相关的ComboBox事件处理程序中将相关的一个设置为bool。举个简单的例子:

XAML:

true

代码背后:

SelectionChanged

显然,您仍然需要在<ComboBox Name="Re" Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Loaded="ComboBox_RCLoaded" SelectionChanged="ComboBox_RCSelectionChanged" Visibility="{StaticResource BooleanToVisibilityConverter}" /> 部分添加对private void ComboBox_PLSelectionChanged(object sender, SelectionChangedEventArgs args) { ComboBox comboBox = sender as ComboBox; var data = GetDataForNextComboBox(comboBox.SelectedItem); NextComboBox.ItemsSource = data; // Make next ComboBox visible using BooleanToVisibilityConverter BoolPropertyForComboBox2 = true; } 的引用,声明新的BooleanToVisibilityConverter属性并实施Resources数据来自示例的访问方法。

答案 1 :(得分:0)

如果您没有使用MVVM,那么 Sheridan 给出的答案可能会让您感到高兴,因为您可以在该事件本身中设置可见性,而不是使用bool变量和BoolToVisibility转换器(正如 almulo 所说的那样)。

如果您或任何使用MVVM并遇到此问题的人,可以查看我的答案。

我刚刚添加了代码,根据ComboBox1的SelectedItem设置可见性,并根据ComboBox1的SelectedItem设置ItemsSource。

在ViewModel中可以做的事情。

  1. 拥有绑定到ComboBox1的SelectedItem的属性。
  2. 根据ComboBox1的SelectedItem,有一个需要绑定到ComboBox2的集合属性。
  3. 每当SelectedItemCombo1更改时,更新绑定到ComboBox2的ItemsSource的集合属性(您可以在Combo1的SelectedItem的PropertyChanged事件中执行此操作,否则您可以在VM中为SelectionChanged编写命令)
  4. 找到ComboBox2的XAML代码,我添加了转换器以检查ComboBox1的SelectedItem,如果它为null,则ComboBox2将不可见。

    <ComboBox Name="Re" Grid.Row="2" Grid.Column="1" VerticalAlignment="Top"  ItemsSoure="{Binding combo1Selected}"
        Visibility="{Binding ElementName=PL, Path=SelectedItem, Converter={StaticResource selectedItemToVisibilityConverter}}"> />
    

    转换器如下:

    public class SelectedItemToVisibility : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value == null)
                    return Visibility.Collapsed;
                else
                    return Visibility.Visible;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    希望这会对你有所帮助。

相关问题