【问题标题】:How to link 2 comboboxes如何链接 2 个组合框
【发布时间】:2016-09-17 16:21:39
【问题描述】:

我有 2 个组合框,每个组合框有 2 种方法用于 _Loaded 和 _Selection 已更改

我想在第一个组合框中选择一个位置,然后下一个组合框应该列出该特定位置的一堆日期

这是我目前所拥有的:

    <ComboBox 
    x:Name="comboBoxLocation" 
    Text="Lokation"       
    HorizontalAlignment="Left" Margin="50,305,0,0" 
    VerticalAlignment="Top"  
    Width="120" 
    Loaded="ComboBoxLocation_Loaded" 
    SelectionChanged="ComboBoxLocation_SelectionChanged"/>

    <ComboBox x:Name="comboBoxDate" 
    Text="Dato" HorizontalAlignment="Left" 
    Margin="195,305,0,0" 
    VerticalAlignment="Top" Width="120" 
    Loaded="ComboBoxDate_Loaded"  
    SelectionChanged="ComboBoxDate_SelectionChanged"/>

    private void ComboBoxLocation_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var comboBoxLocation = sender as ComboBox;

        comboBoxDate.SelectedIndex = 0;
        comboBoxDate.ItemsSource = controller.GetBusTimes();

        //ComboBoxDate_Loaded(sender, e);
    }

    private void ComboBoxDate_Loaded(object sender, RoutedEventArgs e)
    {
        List<string> dataDate = controller.GetBusTimes();

        var comboBoxDate = sender as ComboBox;

        comboBoxDate.ItemsSource = dataDate;
    }

这似乎比我预期的要困难得多...我开始认为我可能在这里犯了一些根本性错误...

我一直在摆弄这个...我可以设法在第一个框中显示位置列表,并在第二个框中显示该位置的相关日期。但是当我更改第一个位置时,日期保持不变...

我该怎么办?

【问题讨论】:

  • 我会将第一个组合框的选定项目绑定到您的视图模型中的一个属性,并在设置器中更改另一个属性中的项目集合(应该是可观察的),该属性也绑定在图形用户界面。你知道我的意思吗?
  • “犯了一些根本性的错误” - 你使用 wpf 就像它是 winforms,所以你继承了后者的所有绑定问题。使用 MVVM 模式可以很容易地创建数据的主/细节关系。例如。将项目集合绑定到一个组合框ItemsSource(并仅显示位置),其中SelectedItem 绑定到设置器中的属性,您更新其详细信息(创建另一个集合并上升通知)绑定到第二个组合框ItemsSource。跨度>
  • 而你的错误实际上是试图使用Loaded 事件。它只上升了一次。而是在comboBoxLocation_SelectionChanged 中重新设置comboBoxDate.ItemsSource。我看到您尝试过(注释行),您可能需要分两步进行(首先将其设置为null)。
  • 我不确定他是否听说过或使用过 MVVM。也许有人应该介绍一下 MVVM 如何让他轻松完成他想要的事情。

标签: c# wpf combobox


【解决方案1】:

试试这个,我已经用它在我的 Windows 窗体应用程序中链接了 2 个组合框。

默认设置两个组合框选择为0 //Combobox1.SelectedIndex = 0;

 private void combobox1_SelectedIndexChanged(object sender, EventArgs e)
    {
       var combobox1VALUE= combobox1.Text;
    }

private void combobox2_DropDown(object sender, EventArgs e)
        {
           //Select datasouece according to combobox 1 data selection(combobox1VALUE) 
            combobox2.Items.Clear();
          //add data to combobox2

        }

【讨论】:

  • 你了解OP吗?
【解决方案2】:

为什么不单独绑定Item source和selected item?

<Combobox ItemsSource="{Binding ItempsProperty}" SelectedItem="{Binding StrValueProperty, Mode=TwoWay}" />

你可以在另一个的 setter 中设置一个属性

【讨论】:

    【解决方案3】:

    您的代码有 2 个问题。

    1. 尚不清楚 controller.GetBusTimes() 在何处以及如何获取有关更改位置的信息? 如果上述功能以某种方式知道位置变化并且仍然没有在另一个组合框中显示更新的信息,那么

    2. 另请参阅此答案,了解如何在 ItemSource 更改后显示 refresh 组合框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2012-06-16
      • 2019-07-02
      • 2015-12-30
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多