我在我的项目中使用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>
答案 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中可以做的事情。
找到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();
}
}
希望这会对你有所帮助。