0

我在我的项目中使用 WPF C#。我的 UI 包含 4 个组合框,每个组合框都将由数据库中的值加载。现在一次显示所有 4 个组合框。但我想要做的是,第一个组合框 1 应该可见/显示,然后用户选择一个值说 val1,然后第二个组合框应该是可见的,它应该包含基于在组合框 1 中选择的 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>
4

2 回答 2

0

您可以使用BooleanToVisibilityConverterClass来显示和隐藏各种ComboBoxes 以及bool代码背后或视​​图模型中的许多属性。您可以将相关事件处理程序设置为true相关SelectionChanged事件处理程序。举个简单的例子:

XAML:

<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部分中添加对 的引用,声明新bool属性并实现GetDataForNextComboBox示例中的数据访问方法。

于 2015-06-16T12:31:04.977 回答
0

如果您不使用 MVVM,那么Sheridan给出的答案会帮助您,因为您可以在该事件本身中设置 Visibility,而不是使用 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 编写命令)

找到 ComboBox2 的 XAML 代码,我添加了转换器来检查 ComboBox1 的 SelectedItem,如果它为空,则 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();
        }
    }

希望这对您有所帮助。

于 2015-06-16T14:03:34.450 回答