级联实现.自动选择子列表中的第一项

本文关键字:一项 实现 选择 列表 级联 | 更新日期: 2023-09-27 18:13:13

我在WPF项目中使用MVVM。我的视图上有两个列表框。第二个ListBox绑定到第一个ListBox的SelectedItem。类似于在选择国家时填充省/州组合框,只使用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");
        }
    }

相同的对象在我的模型:

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; }
    ...
}

最后是View的相关部分:

<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>

级联实现.自动选择子列表中的第一项

您可以设置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;
    }
}