1

我正在开发一个使用本地数据库和 MVVM 的 Windows Phone 应用程序。我的列表框没有显示它绑定到的 WeatherList。我在 App.xaml.cs 文件中将单个 WeatherItem 添加到本地数据库,并且已成功添加,但在运行应用程序时它未显示在列表框中。我真的很感激任何帮助。我有以下设置:

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
}

主页.xaml.cs

// Constructor
    public MainPage()
    {
        InitializeComponent();
        this.DataContext = App.WeatherViewModel;
    }

应用程序.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();

    }

谢谢!

4

2 回答 2

0

您是否检查了输出窗口中的数据绑定错误?

而在主页面的ctor中,App.WeatherViewModel是否已经不为空了?

于 2012-09-05T18:08:56.890 回答
0

你加

WeatherListBox.DataContext = WeatherList;

你修改绑定

ItemsSource="{Binding}"
于 2012-09-05T18:14:49.223 回答