2012-09-04 60 views
1

我正在使用本地數據庫和MVVM的Windows Phone應用程序。我的列表框沒有顯示它綁定到的WeatherList。我將一個WeatherItem添加到App.xaml.cs文件中的本地數據庫,並且它已成功添加,但運行該應用程序時它不會顯示在列表框中。我真的很感激任何幫助。我有以下設置:與ViewModel的列表框數據綁定不顯示Windows Phone

MainPage.xaml中:

<phone:PhoneApplicationPage.Resources> 
    <DataTemplate x:Key="ForecastListItemTemplate"> 
     <StackPanel Orientation="Horizontal" Margin="0, 400, 0, 0" Width="480" Height="100"> 
      <StackPanel Width="190" VerticalAlignment="Center"> 
       <TextBlock HorizontalAlignment="Center" Text="{Binding Path=DayOfWeek}" FontFamily="Segoe WP" FontWeight="ExtraBold" FontSize="36" Foreground="#545d61"></TextBlock> 
       <TextBlock HorizontalAlignment="Center" Text="{Binding Path=ItemDay}" FontFamily="Segoe WP Light" FontSize="36" Foreground="#545d61"></TextBlock> 
      </StackPanel> 
      <Image Height="100" Width="100" Source="{Binding Path=ImageSource}"></Image> 
      <StackPanel Width="190" VerticalAlignment="Center"> 
       <StackPanel HorizontalAlignment="Center" Orientation="Horizontal"> 
        <TextBlock Text="↑" FontFamily="Segoe WP" FontWeight="ExtraBold" FontSize="36" Foreground="#545d61"></TextBlock> 
        <TextBlock HorizontalAlignment="Center" Margin="4, 0, 4, 0" Text="{Binding Path=High}" FontFamily="Segoe WP" FontWeight="ExtraBold" FontSize="36" Foreground="#0da5d0"></TextBlock> 
        <TextBlock Text="↓" FontFamily="Segoe WP" FontWeight="ExtraBold" FontSize="36" Foreground="#545d61"></TextBlock> 
        <TextBlock HorizontalAlignment="Center" Margin="4, 0, 4, 0" Text="{Binding Path=Low}" FontFamily="Segoe WP" FontWeight="ExtraBold" FontSize="36" Foreground="#0da5d0"></TextBlock> 
       </StackPanel> 
       <TextBlock HorizontalAlignment="Center" Text="{Binding Path=Condition}" FontFamily="Segoe WP Light" FontSize="24" Foreground="#545d61"></TextBlock> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
</phone:PhoneApplicationPage.Resources> 

<!--LayoutRoot is the root grid where all page content is placed--> 
<Grid x:Name="LayoutRoot" Background="#e1e4e4"> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

<ListBox 
     x:Name="WeatherListBox" 
     ItemsSource="{Binding WeatherList}" 
     Margin="0, 400, 0, 96" 
     Width="480" 
     ItemTemplate="{StaticResource ForecastListItemTemplate}"> 
    </ListBox> 
</Grid> 

WeatherViewModel.cs

public class WeatherViewModel : INotifyPropertyChanged 
{ 
    // LINQ to SQL data context for the local database. 
    private ToDoDataContext weatherDB; 

    // Class constructor, create the data context object. 
    public WeatherViewModel() 
    { 
     weatherDB = new ToDoDataContext(); 
    } 

    // All to-do items. 
    private ObservableCollection<WeatherItem> _weatherList; 
    public ObservableCollection<WeatherItem> WeatherList 
    { 
     get { return _weatherList; } 
     set 
     { 
      _weatherList = value; 
      NotifyPropertyChanged("WeatherList"); 
     } 
    } 



    // Write changes in the data context to the database. 
    public void SaveChangesToDB() 
    { 
     weatherDB.SubmitChanges(); 
    } 

    // Query database and load the collections and list used by the pivot pages. 
    public void LoadCollectionsFromDatabase() 
    { 
     // Specify the query for all to-do items in the database. 
     var weatherItemsInDB = from WeatherItem weather in weatherDB.Forecasts 
           select weather; 

     // Query the database and load all to-do items. 
     WeatherList = new ObservableCollection<WeatherItem>(weatherItemsInDB); 
    } 



    // Add a to-do item to the database and collections. 
    public void AddWeatherItem(WeatherItem newWeatherItem) 
    { 
     // Add a to-do item to the data context. 
     weatherDB.Forecasts.InsertOnSubmit(newWeatherItem); 

     // Save changes to the database. 
     weatherDB.SubmitChanges(); 

     // Add a to-do item to the "all" observable collection. 
     WeatherList.Add(newWeatherItem); 

    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Used to notify Silverlight that a property has changed. 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 

ToDoDataContext.cs

public class ToDoDataContext : DataContext 
{ 

    // Pass the connection string to the base class. 
    public ToDoDataContext() 
     : base("Data Source=isostore:/AppDB.sdf") 
    { } 

    public ToDoCategory activeCategory; 

    // Specify a table for the to-do items. 
    public Table<ToDoItem> Items; 

    // Specify a table for the categories. 
    public Table<ToDoCategory> Categories; 

    //Weather stuff 
    public WeatherItem currentWeather; 

    // Specify a table for the to-do items. 
    public Table<WeatherItem> Forecasts; 
} 

    [Table] 
public class WeatherItem : INotifyPropertyChanged, INotifyPropertyChanging 
{ 

    // Define ID: private field, public property, and database column. 
    private int _weatherItemId; 

    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] 
    public int WeatherItemId 
    { 
     get { return _weatherItemId; } 
     set 
     { 
      if (_weatherItemId != value) 
      { 
       NotifyPropertyChanging("WeatherItemId"); 
       _weatherItemId = value; 
       NotifyPropertyChanged("WeatherItemId"); 
      } 
     } 
    } 

    // Define item name: private field, public property, and database column. 
    private string _itemDay; 

    [Column] 
    public string ItemDay 
    { 
     get { return _itemDay; } 
     set 
     { 
      if (_itemDay != value) 
      { 
       NotifyPropertyChanging("ItemDay"); 
       _itemDay = value; 
       NotifyPropertyChanged("ItemDay"); 
      } 
     } 
    } 

    private string _dayOfWeek; 

    [Column] 
    public string DayOfWeek 
    { 
     get { return _dayOfWeek; } 
     set 
     { 
      if (_dayOfWeek != value) 
      { 
       NotifyPropertyChanging("DayOfWeek"); 
       _dayOfWeek = value; 
       NotifyPropertyChanged("DayOfWeek"); 
      } 
     } 
    } 

    // Define completion value: private field, public property, and database column. 

    private string _high; 

    [Column] 
    public string High 
    { 
     get { return _high; } 
     set 
     { 
      if (_high != value) 
      { 
       NotifyPropertyChanging("High"); 
       _high = value; 
       NotifyPropertyChanged("High"); 
      } 
     } 
    } 

    private string _low; 

    [Column] 
    public string Low 
    { 
     get { return _low; } 
     set 
     { 
      if (_low != value) 
      { 
       NotifyPropertyChanging("Low"); 
       _low = value; 
       NotifyPropertyChanged("Low"); 
      } 
     } 
    } 

    private string _condition; 

    [Column] 
    public string Condition 
    { 
     get { return _condition; } 
     set 
     { 
      if (_condition != value) 
      { 
       NotifyPropertyChanging("Condition"); 
       _condition = value; 
       NotifyPropertyChanged("Condition"); 
      } 
     } 
    } 

    private string _imageSource; 
    [Column] 
    public string ImageSource 
    { 
     get { return _imageSource; } 
     set 
     { 
      if (_imageSource != value) 
      { 
       NotifyPropertyChanging("ImageSource"); 
       _imageSource = value; 
       NotifyPropertyChanged("ImageSource"); 
      } 
     } 
    } 

    // Version column aids update performance. 
    [Column(IsVersion = true)] 
    private Binary _version; 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Used to notify that a property changed 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 

    #region INotifyPropertyChanging Members 

    public event PropertyChangingEventHandler PropertyChanging; 

    // Used to notify that a property is about to change 
    private void NotifyPropertyChanging(string propertyName) 
    { 
     if (PropertyChanging != null) 
     { 
      PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 

MainPage.xaml.cs中

App.xaml.cs

public partial class App : Application 
{ 
    private static ToDoViewModel viewModel; 
    public static ToDoViewModel ViewModel 
    { 
     get { return viewModel; } 
    } 

    private static WeatherViewModel weatherViewModel; 
    public static WeatherViewModel WeatherViewModel 
    { 
     get { return weatherViewModel; } 
    } 

    /// <summary> 
    /// Provides easy access to the root frame of the Phone Application. 
    /// </summary> 
    /// <returns>The root frame of the Phone Application.</returns> 
    public PhoneApplicationFrame RootFrame { get; private set; } 

    /// <summary> 
    /// Constructor for the Application object. 
    /// </summary> 
    public App() 
    { 
     // Global handler for uncaught exceptions. 
     UnhandledException += Application_UnhandledException; 

     // Standard Silverlight initialization 
     InitializeComponent(); 

     // Phone-specific initialization 
     InitializePhoneApplication(); 

     // Show graphics profiling information while debugging. 
     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      // Display the current frame rate counters. 
      Application.Current.Host.Settings.EnableFrameRateCounter = true; 

      // Show the areas of the app that are being redrawn in each frame. 
      //Application.Current.Host.Settings.EnableRedrawRegions = true; 

      // Enable non-production analysis visualization mode, 
      // which shows areas of a page that are handed off to GPU with a colored overlay. 
      //Application.Current.Host.Settings.EnableCacheVisualization = true; 

      // Disable the application idle detection by setting the UserIdleDetectionMode property of the 
      // application's PhoneApplicationService object to Disabled. 
      // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run 
      // and consume battery power when the user is not using the phone. 
      PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; 
     } 

     // Create the database if it does not exist. 
     using (ToDoDataContext db = new ToDoDataContext()) 
     { 
      if (db.DatabaseExists() == false) 
      { 
       // Create the local database. 
       db.CreateDatabase(); 

       // Prepopulate the categories. 
       db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" }); 
       db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" }); 
       db.Categories.InsertOnSubmit(new ToDoCategory { Name = "School" }); 

       db.Forecasts.InsertOnSubmit(new WeatherItem 
       { 
        DayOfWeek = "Mon", 
        ItemDay = "Sept 4", 
        Condition = "Mostly Sunny", 
        High = "105", 
        Low = "88", 
        ImageSource = "images/Weather/45.png" 
       }); 

       // Save categories to the database. 
       db.SubmitChanges(); 
      } 
     } 

     // Create the ViewModel object. 
     viewModel = new ToDoViewModel(); 
     weatherViewModel = new WeatherViewModel(); 

     // Query the local database and load observable collections. 
     viewModel.LoadCollectionsFromDatabase(); 
     weatherViewModel.LoadCollectionsFromDatabase(); 

    } 

謝謝!

+0

結合的一些文件是不完整的,但我試圖只發布相關的代碼。請讓我知道爲什麼它是如果可能的話投了票。 – dannyp32

回答

0

您是否檢查了數據綁定錯誤的輸出窗口?

而在主頁的ctor中,App.WeatherViewModel已經不是null了嗎?

0

您添加

WeatherListBox.DataContext = WeatherList; 

你修改與

ItemsSource="{Binding}" 
相關問題