WPF MVVM组合框仅在更新属性后显示最小数量的项目

时间:2015-02-18 06:29:10

标签: c# wpf mvvm combobox

我目前遇到的问题是组合框仅显示1个项目而不是组合框中的所有项目。

所以我所拥有的是列出所有父项的列表框。此外,还有一个选定的项目称为SelectedParent。 例如:Parent1      Parent2      Parent3

每个父级都有自己的子级数,选择“父级”项会自动更新组合框以包含正确的子项。因此,让我们说父母1有孩子1,孩子2和孩子3,而父母2只有孩子4.选择父1并点击组合框将显示所有三个孩子(正确行为)

Parent 1      --- -  Child 1
              -----  Child 2
              ------ Child 3

现在选择父2,也将显示正确的Child 4

Parent 2      --- -  Child 4

然而切换回父1,组合框现在只会在点击时显示一个项目,这是第一项Child 1

Parent 1      --- -  Child 1

子组件2和子组件3在组合框中隐藏,即使调试代码我发现属性包含子项2和子项3.我已经测试了各种组合,基本上组合框下拉列表只显示最小数量的组合在父母之间切换的要素。

伪代码写在下面,我正在使用MVVM模式。

ListBox x:Name="Item" Margin="0,5,0,0" Grid.Row="1" Grid.Column="0"  
                 ItemsSource="{Binding AllParentItems}" 
                 DisplayMemberPath="Name"
                 SelectedItem="{Binding SelectedParent}" >

<ComboBox Grid.Row="2" Grid.Column="1"
                        HorizontalAlignment="Stretch" 
                        SelectedItem="{Binding SelectedChild}" 
                        ItemsSource="{Binding AllChildItems}"
                        DisplayMemberPath="Name"> 

我正在使用MVVM模式,在viewmodel的属性中,我定义了以下属性:

public ObservableCollection<T> AllParentItems
{
    get{...} // populate and retrieve the Parent values 
}

public T SelectedParent

    {
        get {return _selectedParent;}
        set {
             _selectedParent = value;
             GetChildrenForThisParent();
    }}

private GetChildrenForThisParent()
{
     // based on the state of the selected parent,
     // it will set AllChildItems differently
     // for example it will return list containing Child1, Child2, or Child 3
     // and for the different parent, ALlChildItems will have only Child 4
}

public Observable<T2> AllChildItems
{get;private set;}

我尝试过MaxDropDownHeight和Combobox的其他属性,但没有观察到任何变化。您是否知道此类问题或任何可能的解决方案?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果使用分层数据结构,您的要求将更容易实现。我的意思是,如果您有一个包含子项集合的父数据类,您可以直接将数据绑定到每个父项的子项,如下所示:

<ListBox x:Name="Item" Margin="0,5,0,0" Grid.Row="1" Grid.Column="0"  
    ItemsSource="{Binding AllParentItems}" 
    DisplayMemberPath="Name"
    SelectedItem="{Binding SelectedParent}" ... >

<ComboBox Grid.Row="2" Grid.Column="1"
    HorizontalAlignment="Stretch" 
    SelectedItem="{Binding SelectedChild}" 
    ItemsSource="{Binding AllParentItems/ChildItems}"
    DisplayMemberPath="Name" ... >

请注意AllParentItems/ChildItems Binding.Path,这意味着 ChildItems集合中所选项目的AllParentItems属性。有关Binding Path的详细信息,请参阅MSDN上的Binding.Path Property页面。