2014-01-15 105 views
1

我正在創建一個待辦事項列表應用程序。目前我想從todolistPage.xaml添加一個新的待辦事項列表,並且在添加之後,我想讓數據能夠在MainPage.xaml中查看。我可以從todolistPage查看它,但不知道如何將它帶到另一頁。希望能有一些幫助。謝謝。 下面是我的代碼如何在Windows Phone 8的頁面內共享數據庫?

MainPage.xaml.cs中

namespace PivotApp3 
{ 
public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 

     // Set the data context of the listbox control to the sample data 
     DataContext = App.ViewModel; 

     // Sample code to localize the ApplicationBar 
     //BuildLocalizedApplicationBar(); 
    } 

    // Load data for the ViewModel Items 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     if (!App.ViewModel.IsDataLoaded) 
     { 
      App.ViewModel.LoadData(); 
     } 
    } 

    private void LongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var si = mLongListSelector.SelectedItem as PivotApp3.ViewModels.ItemViewModel; 

     if (mLongListSelector.SelectedItem == null) 
      return; 

     if (si.LineOne.Equals("+ To Do List")) 
      NavigationService.Navigate(new Uri("/todolistPage.xaml", UriKind.Relative)); 
     else if (si.LineOne.Equals("+ Reminder")) 
      NavigationService.Navigate(new Uri("/reminderPage.xaml", UriKind.Relative)); 

     // Reset selected item to null (no selection) 
     mLongListSelector.SelectedItem = null; 
    } 
} 

MainPage.xaml中

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

    <!-- LOCALIZATION NOTE: 
     To localize the displayed strings copy their values to appropriately named 
     keys in the app's neutral language resource file (AppResources.resx) then 
     replace the hard-coded text value between the attributes' quotation marks 
     with the binding clause whose path points to that string name. 

     For example: 

      Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}" 

     This binding points to the template's string resource named "ApplicationTitle". 

     Adding supported languages in the Project Properties tab will create a 
     new resx file per language that can carry the translated values of your 
     UI strings. The binding in these examples will cause the value of the 
     attributes to be drawn from the .resx file that matches the 
     CurrentUICulture of the app at run time. 
    --> 

    <!--Pivot Control--> 
    <phone:Pivot Title="DAILY ROUTINE"> 
     <!--Pivot item one--> 
     <phone:PivotItem Header="activity"> 
      <!--Double line list with text wrapping--> 
      <phone:LongListSelector x:Name="mLongListSelector" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="LongListSelector_SelectionChanged"> 
       <phone:LongListSelector.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Margin="0,0,0,17"> 
          <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         </StackPanel> 
        </DataTemplate> 
       </phone:LongListSelector.ItemTemplate> 
      </phone:LongListSelector> 
     </phone:PivotItem> 

     <!--Pivot item two--> 
     <phone:PivotItem Header="today"> 

     </phone:PivotItem> 
    </phone:Pivot> 

    <!--Uncomment to see an alignment grid to help ensure your controls are 
     aligned on common boundaries. The image has a top margin of -32px to 
     account for the System Tray. Set this to 0 (or remove the margin altogether) 
     if the System Tray is hidden. 

     Before shipping remove this XAML and the image itself.--> 
    <!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" IsHitTestVisible="False" />--> 
</Grid> 

todolistPage.xaml.cs

namespace PivotApp3 
{ 
public partial class todolistPage : PhoneApplicationPage, INotifyPropertyChanged 
{ 

    // Data context for the local database 
    private ToDoDataContext toDoDB; 

    // Define an observable collection property that controls can bind to. 
    private ObservableCollection<ToDoItem> _toDoItems; 
    public ObservableCollection<ToDoItem> ToDoItems 
    { 
     get 
     { 
      return _toDoItems; 
     } 
     set 
     { 
      if (_toDoItems != value) 
      { 
       _toDoItems = value; 
       NotifyPropertyChanged("ToDoItems"); 
      } 
     } 
    } 

    //constructor 
    public todolistPage() 
    { 
     InitializeComponent(); 

     // Connect to the database and instantiate data context. 
     toDoDB = new ToDoDataContext(ToDoDataContext.DBConnectionString); 

     // Data context and observable collection are children of the main page. 
     this.DataContext = this; 

    } 

    private void deleteTaskButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Cast parameter as a button. 
     var button = sender as Button; 

     if (button != null) 
     { 
      // Get a handle for the to-do item bound to the button. 
      ToDoItem toDoForDelete = button.DataContext as ToDoItem; 

      // Remove the to-do item from the observable collection. 
      ToDoItems.Remove(toDoForDelete); 

      // Remove the to-do item from the local database. 
      toDoDB.ToDoItems.DeleteOnSubmit(toDoForDelete); 

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

      // Put the focus back to the main page. 
      this.Focus(); 
     } 
    } 


    private void newToDoTextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     // Clear the text box when it gets focus. 
     newToDoTextBox.Text = String.Empty; 
    } 

    private void newToDoAddButton_Click(object sender, RoutedEventArgs e) 
    { 
     // Create a new to-do item based on the text box. 
     ToDoItem newToDo = new ToDoItem { ItemName = newToDoTextBox.Text }; 

     // Add a to-do item to the observable collection. 
     ToDoItems.Add(newToDo); 

     // Add a to-do item to the local database. 
     toDoDB.ToDoItems.InsertOnSubmit(newToDo); 
    } 

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     // Call the base method. 
     base.OnNavigatedFrom(e); 

     // Save changes to the database. 
     toDoDB.SubmitChanges(); 
    } 

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     // Define the query to gather all of the to-do items. 
     var toDoItemsInDB = from ToDoItem todo in toDoDB.ToDoItems 
          select todo; 

     // Execute the query and place the results into a collection. 
     ToDoItems = new ObservableCollection<ToDoItem>(toDoItemsInDB); 

     // Call the base method. 
     base.OnNavigatedTo(e); 
    } 


    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

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

} 



public class ToDoDataContext : DataContext 
{ 
    // Specify the connection string as a static, used in main page and app.xaml. 
    public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf"; 

    // Pass the connection string to the base class. 
    public ToDoDataContext(string connectionString) 
     : base(connectionString) 
    { } 

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



[Table] 
public class ToDoItem : INotifyPropertyChanged, INotifyPropertyChanging 
{ 
    // Define ID: private field, public property and database column. 
    private int _toDoItemId; 

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

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

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

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

    [Column] 
    public bool IsComplete 
    { 
     get 
     { 
      return _isComplete; 
     } 
     set 
     { 
      if (_isComplete != value) 
      { 
       NotifyPropertyChanging("IsComplete"); 
       _isComplete = value; 
       NotifyPropertyChanged("IsComplete"); 
      } 
     } 
    } 
    // Version column aids update performance. 
    [Column(IsVersion = true)] 
    private Binary _version; 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Used to notify the page that a data context 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 the data context that a data context property is about to change 
    private void NotifyPropertyChanging(string propertyName) 
    { 
     if (PropertyChanging != null) 
     { 
      PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 

todolistPage.xaml

<!--LayoutRoot is the root grid where all page content is placed--> 
<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <!--TitlePanel contains the name of the application and page title--> 
    <StackPanel Grid.Row="0" Margin="12,17,0,28"> 
     <TextBlock Text="TO DO LIST" Style="{StaticResource PhoneTextNormalStyle}"/> 
     <TextBlock Text="add" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
    </StackPanel> 

    <!-- Bind the list box to the observable collection. --> 
    <ListBox x:Name="toDoItemsListBox" ItemsSource="{Binding ToDoItems}" 
       Grid.Row="1" Margin="12,0,28,210" Width="440"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid HorizontalAlignment="Stretch" Width="440"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="50" /> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="100" /> 
        </Grid.ColumnDefinitions> 
        <CheckBox 
          IsChecked="{Binding IsComplete, Mode=TwoWay}" 
          Grid.Column="0" 
          VerticalAlignment="Center"/> 
        <TextBlock 
          Text="{Binding ItemName}" 
          FontSize="{StaticResource PhoneFontSizeLarge}" 
          Grid.Column="1" 
          VerticalAlignment="Center"/> 
        <Button 
          Grid.Column="2" 
          x:Name="deleteTaskButton" 
          BorderThickness="0"         
          Margin="0" 
          Click="deleteTaskButton_Click"> 
         <Image Source="appbar.delete.rest.png"/> 
        </Button> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <!--ContentPanel - place additional content here--> 
    <Grid x:Name="ContentPanel" Grid.Row="2" Margin="12,465,12,0"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10*"/> 
      <ColumnDefinition Width="9*"/> 
     </Grid.ColumnDefinitions> 
     <TextBox 
       x:Name="newToDoTextBox"      
       Grid.Column="0" 
       Text="add new task" 
       FontFamily="{StaticResource PhoneFontFamilyLight}"      
       GotFocus="newToDoTextBox_GotFocus" Margin="0,-65,0,104" Grid.ColumnSpan="2"/> 
     <Button 
       Content="add" 
       x:Name="newToDoAddButton" 
       Click="newToDoAddButton_Click" Margin="150,43,130,10" Grid.ColumnSpan="2"/> 

    </Grid> 
</Grid> 

數據庫創建

 using (ToDoDataContext db = new ToDoDataContext(ToDoDataContext.DBConnectionString)) 
     { 
      if (db.DatabaseExists() == false) 
      { 
       //Create the database 
       db.CreateDatabase(); 
      } 
     } 

回答

1

使數據庫App.xaml.cs:

// Data context for the local database 
public ToDoDataContext toDoDB; 

添加以下代碼到App.xaml.cs:

public new static App Current 
{ 
    get 
    { 
     return (App)Application.Current; 
    } 
} 

然後你就可以通過使用以下地址訪問您的數據庫:

App.Current.toDoDB... 
+0

的那一刻,我把私人ToDoDataContext toDoDB;在我的todolistPage.xaml.cs中。你的意思是我應該將它移動到app.xaml.cs?我在哪裏放置你在第二行中提到的代碼,就像App()類一樣? –

+0

如果您希望數據庫在所有頁面都可用,則應將其移至App.xaml.cs.您可以將其保留爲私有,但在此情況下提供訪問功能。上面的代碼只是爲了更方便地訪問App.Current對象。你可以放在App.xaml.cs所需的位置。 – crea7or

+0

你的意思是?[Column] public bool IsComplete { get { return _isComplete; } set if(_isComplete!= value) { NotifyPropertyChanging(「IsComplete」); _isComplete = value;NotifyPropertyChanged(「IsComplete」); } } } //放在App.xaml.cs中? –

1

您可以創建類SQL操作數據,並使其從App.xaml.cs 這裏繳費是示例代碼 ToDoDataViewModel類:

public class ToDoDataViewModel : INotifyPropertyChanged 
{ 
    ToDoDataContext db; 

    public ToDoDataViewModel(string connectionString) 
    { 
     db = new ToDoDataContext(connectionString); 
    } 

    private ObservableCollection<ToDoItem> _toDoItems; 
    public ObservableCollection<ToDoItem> ToDoItems 
    { 
     get { return this._toDoItems; } 
     set 
     { 
      this._toDoItems = value; 
      NotifyPropertyChanged("ToDoItems"); 
     } 
    } 

    public void LoadCollectionsFromDatabase() 
    { 
     var toDos = from todo in db.ToDoItems 
         select todo; 

     _toDoItems = new ObservableCollection<ToDoItem>(toDos); 

    } 

    public void InsertToDoItem(ToDoItem item) 
    { 
     db.ToDoItems.InsertOnSubmit(item); 
     _toDoItems.Add(item); 
     db.SubmitChanges(); 
    } 

    public void DeleteToDoItem(ToDoItem item) 
    { 
     db.ToDoItems.DeleteOnSubmit(item); 
     _toDoItems.Remove(item); 
     db.SubmitChanges(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

在App.xaml.cs:

public partial class App : Application 
{ 
private static ToDoDataViewModel _viewModel; 
    public static ToDoDataViewModel ViewModel 
    { 
     get { return _viewModel; } 
    } 

//other methods of App 

public App() 
{ 
    //place this code at the and of the contructor 

    CreateDb(); 
} 

private void CreateDb() 
{ 
    using(var db=new ToDoDataContext(ToDoDataContext.DBConnectionString)) 
    { 
     if(!db.DatabaseExists()) 
     { 
      db.CreateDatabase(); 
     } 
    } 

    _viewModel=new ToDoDataViewModel(ToDoDataContext.DBConnectionString); 
    _viewModel.LoadCollectionsFromDatabase(); 
} 

}

,並把這個代碼在頁面的構造函數:

this.DataContext=App.ViewModel; 

這樣,您從應用程序邏輯 分離數據庫的邏輯現在,您可以更新您的newToDoAddButton_Click方法如下:

private void newToDoAddButton_Click(object sender, RoutedEventArgs e) 
{ 
    // Create a new to-do item based on the text box. 
    ToDoItem newToDo = new ToDoItem { ItemName = newToDoTextBox.Text }; 

//Add to-do item to the local database 
App.ViewModel.InsertToDoItem(newToDo); 
    this.Focus(); 
} 

而且你deleteTaskButton_Click方法:

private void deleteTaskButton_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 

    if (button != null) 
    { 
     // Get a handle for the to-do item bound to the button. 
     ToDoItem toDoForDelete = button.DataContext as ToDoItem; 

     // Remove the to-do item from the local database. 
     App.ViewModel.DeleteToDoItem(toDoForDelete); 
     this.Focus();   
    } 
}