级联组合框不会更新依赖组合框的项目源

时间:2017-07-07 02:43:23

标签: c# wpf combobox

我有两个组合框

<ComboBox x:Name="cmbInstanceList" Margin="15,0,5,0" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding InstanceList}" SelectionChanged="cmbInstanceList_SelectionChanged"

                              Height="25" 
                              Style="{StaticResource InputControlErrorsCombo}" Validation.ErrorTemplate="{StaticResource validationTemplate}"  />    
<ComboBox x:Name="cmbDatabaseList" Margin="15,0,5,0" Grid.Row="2" Grid.Column="1" ItemsSource="{Binding DatabaseList}"

                              Height="25" Style="{StaticResource InputControlErrorsCombo}" Validation.ErrorTemplate="{StaticResource validationTemplate}" />

这里,基于 cmbInstanceList ,我通过Itemsource属性填充 cmbDatabaseList InstanceList DatabaseList 是List类型的模型属性。

在代码后端,我使用selectionchanged事件来填充第二个组合框。

private void cmbInstanceList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cmbInstanceList.SelectedValue != null)
            {
                this.data.InstanceName = cmbInstanceList.SelectedValue.ToString();
                this.data.DatabaseList.Clear(); // this is not working
                FillData(this.data.InstanceName);
            }
        }

其中this.data表示包含所有属性的模型类。

FillData方法包含对服务的调用,如果数据不可用,则返回数据值将只是一个空列表。

response = service.RequestDatabasesByInstance(request);
                if (response != null)
                {
                    if (response.DatabaseList != null && response.DatabaseList.Any())
                        this.data.DatabaseList = response.DatabaseList.ToList<string>();
                    else
                    {
                        this.data.DatabaseList.Clear();
                        throw new Exception("No data available");
                    }
                }

问题:当我从cmbInstance中选择值并且service返回带有值的列表的响应时,一切正常且工作正常。 当我选择值时,服务无法检索数据并返回空列表存在问题。即使我设置了模型属性来清除项目,在UI上我仍然可以看到组合框包含值并且项目没有被清除。

2 个答案:

答案 0 :(得分:0)

  

我忘记了MVVM的基本概念

您似乎不知道MVVM模式的全部内容......

在视图中处理SelectionChanged事件以实现级联ComboBox是而不是 MVVM。

相反,当设置绑定到第一个ComboBox的{​​{1}}属性的source属性时,应填充第二个SelectedItem的源集合。以下博文中提供了完整示例和更多信息:https://blog.magnusmontin.net/2013/06/17/cascading-comboboxes-in-wpf-using-mvvm/

如果您遵循MVVM模式,则在与级联ComboBox相关的代码隐藏中应该有代码。您在此处介绍的解决方案不遵循MVVM设计模式。

答案 1 :(得分:-1)

我忘记了MVVM的基本概念。 我相信这个答案可能会帮助像我这样试图在空间找到草的人。

解决问题的方法是: 我改变了

  

this.data.DatabaseList.Clear(); //这不起作用

  

this.data.DatabaseList = null;

它开始工作了。

从技术上讲,当我们更改属性的值时,触发PropertyChanged事件(在INotifyPropertyChanged接口中声明)会通知Binding,Binding会更新视图。在我的情况下,我只是清除属性持有的集合对象,而没有触发PropertyChanged事件。

希望这有助于某人。