В качестве упражнения для изучения wpf и понимания того, как работает привязка, у меня есть пример, который работает. Однако когда я пытаюсь загрузить по требованию, у меня ничего не получается.
У меня в основном 3 класса Country-City-Hotels
Если я загружаю ВСЕ за один раз, все это работает, если я загружаю по требованию, оно терпит неудачу.
Что я делаю не так?
Работает
<Window x:Class="MasterDetailCollectionViewSource.CountryCityHotelWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CountryCityHotelWindow" Height="300" Width="450">
<Window.Resources>
<CollectionViewSource Source="{Binding}" x:Key="cvsCountryList"/>
<CollectionViewSource Source="{Binding Source={StaticResource cvsCountryList},Path=Cities}" x:Key="cvsCityList"/>
<CollectionViewSource Source="{Binding Source={StaticResource cvsCityList},Path=Hotels}" x:Key="cvsHotelList"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="Countries"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="Cities"/>
<TextBlock Grid.Column="2" Grid.Row="0" Text="Hotels"/>
<ListBox Grid.Column="0" Grid.Row="1" Name="lstCountries" ItemsSource="{Binding Source={StaticResource cvsCountryList}}" DisplayMemberPath="Name" SelectionChanged="OnSelectionChanged"/>
<ListBox Grid.Column="1" Grid.Row="1" Name="lstCities" ItemsSource="{Binding Source={StaticResource cvsCityList}}" DisplayMemberPath="Name" SelectionChanged="OnSelectionChanged"/>
<ListBox Grid.Column="2" Grid.Row="1" Name="lstHotels" ItemsSource="{Binding Source={StaticResource cvsHotelList}}" DisplayMemberPath="Name" SelectionChanged="OnSelectionChanged"/>
</Grid>
</Window>
НЕ РАБОТАЕТ
Xaml такой же, как и выше, однако я добавил следующее, которое выбирает вещи по требованию.
Он загружает страны только в отличие от другой, где он загружает все сразу, и не требуется код позади.
public CountryCityHotelWindow()
{
InitializeComponent();
//Load only country Initially
lstCountries.ItemsSource=Repository.GetCountries();
DataContext = lstCountries;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lstBox = (ListBox)e.OriginalSource;
switch (lstBox.Name)
{
case "lstCountries":
var country = lstBox.SelectedItem as Country;
if (country == null) return;
lstCities.ItemsSource = Repository.GetCities(country.Name);
break;
case "lstCities":
var city = lstBox.SelectedItem as City;
if (city == null) return;
lstHotels.ItemsSource = Repository.GetHotels(city.Name);
break;
case "lstHotels":
break;
}
}
Что я делаю не так?
Спасибо