2014-12-30 2 views
0

Когда я запустил приложение, я ожидаю увидеть 5 кнопок (см. ItemsControl \ DataTemplate \ Button в моем XAML ниже) с содержимым типа «55/42», обозначающим максимальную максимальную температуру объявления. Однако окно пустое. Я знаю, что это связано с ItemsControl, потому что я могу отображать данные без использования ItemsControl. Может ли кто-то поймать мою ошибку?Почему элемент ItemsControl в следующем WPF XAML ничего не показывает?

<Window x:Class="Embed_WeatherSummaryAsItemsControl_ToMain.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    FocusManager.FocusedElement="{Binding ElementName=InputCity}" 
    Title="Weather App" Height="350" Width="525"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <TextBox x:Name="InputCity" Grid.Row="0" Width="200" Text="{Binding CityAndOptionalCountry}"></TextBox> 
    <Button Grid.Row="0" Width="50" Content="Go" Margin="260,0,0,0" Command="{Binding GetWeatherReportCommand}"></Button> 
    <ItemsControl Grid.Row="1" ItemsSource="{Binding WeatherForecastSummaryCollection}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Content="{Binding Path=MaxMinTemperature}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate>   
    </ItemsControl> 
</Grid> 

Как показано ниже, «WeatherForecastSummaryCollection» коллекция собственности на классе ViewModel и «MaxMinTemperature» является свойством элемента в коллекции.

public class MainWindowViewModel : ViewModelBase 
{ 
    .... 

    private List<WeatherForecastSummary> mWeatherForecastSummaryCollection; 
    public List<WeatherForecastSummary> WeatherForecastSummaryCollection 
    { 
     get { return mWeatherForecastSummaryCollection; } 
     set 
     { 
      mWeatherForecastSummaryCollection = value; 
      OnPropertyChanged("WeatherForecastSummaryCollection"); 
     } 
    } 
    ..... 
} 

public class WeatherForecastSummary 
{ 
    public string MaxMinTemperature { get; set; } 
} 

Спасибо за помощь!

+0

Как вы заполнить коллекцию и привязать элемент управления к нему? –

+0

Можете ли вы показать код, в котором вы фактически создаете экземпляр коллекции и добавить к ней 5 элементов? – andreask

+2

Я предполагаю, что вы сначала присвоили пустой список «WeatherForecastSummaryCollection», а затем добавили 5 элементов (что является стандартным способом). Но List не отправляет уведомление об изменениях содержимого. Измените тип 'List ' на 'ObservableCollection ' поможет. – gomi42

ответ

2

Я думаю, что здесь отсутствует DataContext. Даже если вы используете CodeBehind в View, вам нужно написать

this.DataContext = this; 

или если вы используете someother класс как ViewModel вы можете указать DataContext к этому классу. Просто замените «this» в приведенном выше коде объектом viewmodels. В этом случае было бы,

this.DataContext = new MainWindowViewModel(); 
+0

У приложения xaml code-behind есть этот набор данных. Я добавляю метод переопределения OnStartup приложения, в котором я создаю MainWindow и MainWindowVM, устанавливая DataContext MainWindow в MainWindowVM и, наконец, делаю MainWindow.Show(). У меня проблема с ItemsControl. Я могу привязываться к другому управляющему элементу без каких-либо проблем, поэтому я знаю, что DataContext не проблема, если мне не нужно снова устанавливать DataContext для ItemsControl. – SamDevx

+0

Я не уверен, почему вы это делаете. Можно было бы просто переместить этот бит кода, как я показал выше, в конструктор страницы, который вы хотите привязать к вашему MainWindowViewModel. – adityaswami89

+0

Aditya, без изменений в образе просмотра или страницы или окна, модифицируется с использованием шаблона проектирования MVVM. Ваш совет не решит проблему, потому что виновник был «наблюдаемой» коллекцией, о которой говорилось выше gomi42! Теперь код работает. – SamDevx

Смежные вопросы