我在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>
答案 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有关该事件的说明。