级联列表框。自动在子列表中选择First Item

时间:2015-09-16 19:22:49

标签: c# wpf

我在WPF项目中使用MVVM。我的视图上有2个列表框。第二个ListBox绑定到第一个的SelectedItem。类似于在选择国家/地区时让省/州ComboBox填充,而只使用ListBox。

我遇到问题的部分是让第二个ListBox在用户选择第一个框中的新项目时选择其中的第一个项目。

理想情况下,我正在寻找一些XAML这样做的方法,但如果需要,我可以在代码中抛出一些东西。

我的对象在我的视图模型中表示如下:

    public ObservableCollection<TrafficSignal> TrafficSignals
    {
        get { return _trafficSignals; }
        set
        {
            _trafficSignals = value;
            OnPropertyChanged("TrafficSignals");
        }
    }

    public TrafficSignal SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            OnPropertyChanged("SelectedItem");
        }
    }

我的模型中的相同ojbects:

public class TrafficSignal
{
    public string DataTag { get; set; }
    public string FileName { get; set; }
    public List<Timing> Timings { get; set; }
}
public class Timing
{
    public string Description { get; set; }
    ...
    public List<TimingPhase> TimingPhases { get; set; }
}
public class TimingPhase
{
    public string Description { get; set; }
    ...
}

最后,这里是视图的相关部分:

<StackPanel>
        <Label>Master List</Label>
        <ListBox Name="listTimings" 
        ItemsSource="{Binding SelectedItem.Timings}"
        ItemTemplate="{DynamicResource timingsListTemplate}"
        SelectedIndex="0"
        />

        <ListBox Name="listPhases" 
        ItemsSource="{Binding ElementName=listTimings, Path=SelectedItem.TimingPhases}"
        ItemTemplate="{DynamicResource phasesListTemplate}"
        SelectedIndex="0" 
        />
    </StackPanel>

1 个答案:

答案 0 :(得分:1)

您可以拥有TargetUpdated事件处理程序并选择第一个项目,如下所示:

 <ListBox Name="listPhases" 
    ItemsSource="{Binding ElementName=listTimings, Path=SelectedItem.TimingPhases, 
            NotifyOnTargetUpdated=True}"
    ItemTemplate="{DynamicResource phasesListTemplate}"
    TargetUpdated="OnTargetUpdated"
    SelectedIndex="0" 
    />

void OnTargetUpdated(object sender, DataTransferEventArgs e)
{
    ListBox lb = sender as ListBox;
    if (lb != null && lb.HasItems) 
    {
        lb.SelectedIndex = 0;
    }
}

See here有关该事件的说明。