none
Как связать Page и БД? RRS feed

  • Вопрос

  • Когда из источника данных перетаскиваешь элемент управления (напирмер ComboBox связанный с таблицей) на главное окно (MainWindow), элемент автоматически связывается с БД.

    А когда точно также перетаскиваешь элемент на страницу (Page), то элемент автоматически не связывется. Вопрос: как это сделать вручную?

    MainWindow:

    <Window x:Class="WpfApplication1.MainWindow"<br/>    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br/>    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<br/>    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" <br/>    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" DataContext="{Binding}" <br/>    xmlns:my="clr-namespace:WpfApplication1" Loaded="Window_Loaded" mc:Ignorable="d" Height="642" Width="807"><br/>  <Window.Resources><br/>    <my:dbDataSet x:Key="dbDataSet" /><br/>    <CollectionViewSource x:Key="materialsViewSource" Source="{Binding Path=Materials, Source={StaticResource dbDataSet}}" /><br/>  </Window.Resources><br/>  <Canvas Height="605" Width="772"><br/>    <Frame Name="frame1" NavigationUIVisibility="Visible" Source="page1.xaml" /><br/>    <Frame Name="frame2" NavigationUIVisibility="Hidden" Source="page2.xaml" /><br/>    <ComboBox Canvas.Left="119" Canvas.Top="502" DisplayMemberPath="Name" Height="23" ItemsSource="{Binding Source={StaticResource materialsViewSource}}" Name="materialsComboBox" SelectedValuePath="ID" Width="120"><br/>      <ComboBox.ItemsPanel><br/>        <ItemsPanelTemplate><br/>          <VirtualizingStackPanel /><br/>        </ItemsPanelTemplate><br/>      </ComboBox.ItemsPanel><br/>    </ComboBox><br/>  </Canvas><br/></Window><br/>  <br/><br/>
    

     


    Page:

    <Page x:Class="WpfApplication1.Page1"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       mc:Ignorable="d" 
       d:DesignHeight="496" d:DesignWidth="736"
    	 Title="Параметры 1" 
       xmlns:my="clr-namespace:WpfApplication1" 
       ShowsNavigationUI="True" VerticalAlignment="Top" HorizontalAlignment="Left"
       DataContext="{Binding}">
      <Page.Resources>
        <my:dbDataSet x:Key="dbDataSet" />
        <CollectionViewSource x:Key="materialsViewSource" Source="{Binding Path=Materials, Source={StaticResource dbDataSet}}" />
      </Page.Resources>
    
    ...
                <ComboBox DisplayMemberPath="Name" Grid.Row="1" Height="20" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource materialsViewSource}}" Margin="224,6,0,0" Name="materialsComboBox" SelectedValuePath="ID" VerticalAlignment="Top" Width="99">
                  <ComboBox.ItemsPanel>
                    <ItemsPanelTemplate>
                      <VirtualizingStackPanel />
                    </ItemsPanelTemplate>
                  </ComboBox.ItemsPanel>
                </ComboBox>
    
    28 марта 2011 г. 11:30

Ответы

  • Дело в том, что при добавлении элеманта на главное окно автоматически добавляется код
    1. В MainWindow.xaml.cs:
    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
     {
       WpfApplication1.dbDataSet dbDataSet = ((WpfApplication1.dbDataSet)(this.FindResource("dbDataSet")));
       // Загрузить данные в таблицу Materials. Можно изменить этот код как требуется.
       WpfApplication1.dbDataSetTableAdapters.MaterialsTableAdapter dbDataSetMaterialsTableAdapter = new WpfApplication1.dbDataSetTableAdapters.MaterialsTableAdapter();
       dbDataSetMaterialsTableAdapter.Fill(dbDataSet.Materials);
       System.Windows.Data.CollectionViewSource materialsViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("materialsViewSource")));
       materialsViewSource.View.MoveCurrentToFirst();
     }
    

    2. И в MainWindow.xaml добавляется параметры:
    <Window
    ....
    Loaded="MainWindow_Loaded">
    
    ...
    <!-- ComboBox связан с БД -->
    <ComboBox ... ItemsSource="{Binding Source={StaticResource materialsViewSource}}" ... />
    

     

     Когда точно так же добавляешь элемент на Page он никакого кода автоматически не вставляет, кроме:

    <Page.Resources>
     <my:dbDataSet x:Key="dbDataSet" />
     <CollectionViewSource x:Key="materialsViewSource" Source="{Binding Path=Materials, Source={StaticResource dbDataSet}}" />
     </Page.Resources>
    

     

    Остальное надо прописывать вручную.

    • Помечено в качестве ответа Poke_m 30 марта 2011 г. 6:17
    30 марта 2011 г. 6:17

Все ответы

  • MainWondow ещё раз:
    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" DataContext="{Binding}" 
        xmlns:my="clr-namespace:WpfApplication1" Loaded="Window_Loaded" mc:Ignorable="d" Height="642" Width="807">
      <Window.Resources>
        <my:dbDataSet x:Key="dbDataSet" />
        <CollectionViewSource x:Key="materialsViewSource" Source="{Binding Path=Materials, Source={StaticResource dbDataSet}}" />
      </Window.Resources>
      <Canvas Height="605" Width="772">
        <Frame Name="frame1" NavigationUIVisibility="Visible" Source="page1.xaml" />
        <Frame Name="frame2" NavigationUIVisibility="Hidden" Source="page2.xaml" />
        <ComboBox Canvas.Left="119" Canvas.Top="502" DisplayMemberPath="Name" Height="23" ItemsSource="{Binding Source={StaticResource materialsViewSource}}" Name="materialsComboBox" SelectedValuePath="ID" Width="120">
          <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
              <VirtualizingStackPanel />
            </ItemsPanelTemplate>
          </ComboBox.ItemsPanel>
        </ComboBox>
      </Canvas>
    </Window>
    
    28 марта 2011 г. 12:01
  • Вопрос разрешился.
    • Помечено в качестве ответа Poke_m 29 марта 2011 г. 11:05
    • Снята пометка об ответе Poke_m 30 марта 2011 г. 6:17
    29 марта 2011 г. 11:05
  • Вы можете хотя бы кратко описать решение для других юзеров? Спасибо.


    Для связи [mail]
    29 марта 2011 г. 11:22
  • Дело в том, что при добавлении элеманта на главное окно автоматически добавляется код
    1. В MainWindow.xaml.cs:
    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
     {
       WpfApplication1.dbDataSet dbDataSet = ((WpfApplication1.dbDataSet)(this.FindResource("dbDataSet")));
       // Загрузить данные в таблицу Materials. Можно изменить этот код как требуется.
       WpfApplication1.dbDataSetTableAdapters.MaterialsTableAdapter dbDataSetMaterialsTableAdapter = new WpfApplication1.dbDataSetTableAdapters.MaterialsTableAdapter();
       dbDataSetMaterialsTableAdapter.Fill(dbDataSet.Materials);
       System.Windows.Data.CollectionViewSource materialsViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("materialsViewSource")));
       materialsViewSource.View.MoveCurrentToFirst();
     }
    

    2. И в MainWindow.xaml добавляется параметры:
    <Window
    ....
    Loaded="MainWindow_Loaded">
    
    ...
    <!-- ComboBox связан с БД -->
    <ComboBox ... ItemsSource="{Binding Source={StaticResource materialsViewSource}}" ... />
    

     

     Когда точно так же добавляешь элемент на Page он никакого кода автоматически не вставляет, кроме:

    <Page.Resources>
     <my:dbDataSet x:Key="dbDataSet" />
     <CollectionViewSource x:Key="materialsViewSource" Source="{Binding Path=Materials, Source={StaticResource dbDataSet}}" />
     </Page.Resources>
    

     

    Остальное надо прописывать вручную.

    • Помечено в качестве ответа Poke_m 30 марта 2011 г. 6:17
    30 марта 2011 г. 6:17