WPF,Listbox项目作为其他Listbox的源

时间:2016-12-19 14:45:27

标签: c# wpf xaml listbox items

假设您在WPF中有一个列表框,其中包含1,2,3,4,5等项目。如何根据选择显示另一个列表框,紧挨着第一个列表框显示其项目在第一个列表框?因此,如果您选择"项目2"如果您选择"项目3"在列表框中,您可以在Listbox2中获得2A,2B,2C等。您在Listbox3中获得3A,3B,3C等

Can't embed the picture yet but here's the example of what i need

1 个答案:

答案 0 :(得分:1)

有一个示例说明如何根据此处提供的推荐MVVM设计模式实现此类级联ComboBox:https://blog.magnusmontin.net/2013/06/17/cascading-comboboxes-in-wpf-using-mvvm/

您可以将第一个ListBox的SelectedItem属性绑定到视图模型的source属性。在这个的setter中,然后设置另一个集合属性,将第二个ListBox的ItemsSource属性绑定到,例如:

<ListBox ItemsSource="{Binding Numbers}" SelectedItem="{Binding SelectedNumber}" />

<ListBox ItemsSource="{Binding SubNumbers}" />
private object _selectedNumber;
public object SelectedNumber
{
    get { return _selectedNumber; }
    set
    {
        _selectedNumber = value;
        NotifyPropertyChanged();

        //set items
        SubNumbers = new List<string> { "3A", "3B", "..." };
        NotifyPropertyChanged("SubNumbers");
    }
}

确保您的视图模型类实现了INotifyPropertyChanged接口并引发更改通知以使其正常工作:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

或者,如果模型类的定义方式使得第一个ListBox中的每个项都有一个返回其相关项的集合属性,则可以将第二个ListBox直接绑定到第一个中的SelectedItem的属性:

<ListBox x:Name="lb1" ItemsSource="{Binding Numbers}"/>

<ListBox x:Name="lb2" ItemsSource="{Binding SelectedItem.SubProperty, ElementName=lb1}" />