Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как вынести DataSet и пр. во ViewModel ? / 3 сообщений из 3, страница 1 из 1
02.08.2012, 16:30
    #37902266
Old_Fat_Cat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вынести DataSet и пр. во ViewModel ?
Пытаюсь из окна, содержащего DataSet и пр., сделать "View", вынеся из него данные во "ViewModel".

По умолчанию при перетаскивании таблицы мышью на окно в WPF студия генерирует это:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TryMVVM
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public TryMVVM.db1DataSet db1DataSet;
        public TryMVVM.db1DataSetTableAdapters.UsersTableAdapter db1DataSetUsersTableAdapter;
        public System.Windows.Data.CollectionViewSource usersViewSource;
        
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            db1DataSet = ((TryMVVM.db1DataSet)(this.FindResource("db1DataSet")));
            // Load data into the table Users. You can modify this code as needed.
            db1DataSetUsersTableAdapter = new TryMVVM.db1DataSetTableAdapters.UsersTableAdapter();
            db1DataSetUsersTableAdapter.Fill(db1DataSet.Users);
            usersViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("usersViewSource")));
            usersViewSource.View.MoveCurrentToFirst();
        }
    }
}


и вот это:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<Window x:Class="TryMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:TryMVVM" Loaded="Window_Loaded">
    
    <Window.Resources>
        <my:db1DataSet x:Key="db1DataSet" />
        <CollectionViewSource x:Key="usersViewSource" Source="{Binding Path=Users, Source={StaticResource db1DataSet}}" />
    </Window.Resources>
    
    <Grid DataContext="{StaticResource usersViewSource}">
        <DataGrid AutoGenerateColumns="True" 
                  EnableRowVirtualization="True" 
                  ItemsSource="{Binding}" 
                  Name="usersDataGrid" 
                  RowDetailsVisibilityMode="VisibleWhenSelected"/>
    </Grid>
</Window>


Пытаюсь жить по заветам MVVM, поэтому из файла окна всё убираю и создаю файл для ViewModel:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TryMVVM
{

    public class MainWindowViewModel
    {

        public TryMVVM.db1DataSet db1DataSet;
        public TryMVVM.db1DataSetTableAdapters.UsersTableAdapter db1DataSetUsersTableAdapter;
        public System.Windows.Data.CollectionViewSource usersViewSource;

        public MainWindowViewModel()
        {
            db1DataSet = new db1DataSet();

            db1DataSetUsersTableAdapter = new TryMVVM.db1DataSetTableAdapters.UsersTableAdapter();
            db1DataSetUsersTableAdapter.Fill(db1DataSet.Users);

            //usersViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("usersViewSource")));
            //usersViewSource.View.MoveCurrentToFirst();
        }

    }
}


К этим данным из XAML пытаюсь достучаться так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<Window x:Class="TryMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:TryMVVM"
        Title="MainWindow" Height="350" Width="525" >
        <!--Loaded="Window_Loaded" эту строку убрал, 
         т.к. данные сейчас инициируются в конструкторе ViewModel-->
    
    <Window.Resources>
        <!--создаём экземпляр ViewModel-->
        <my:MainWindowViewModel x:Key="MainWinViewModel" />
        
        <!--Надо не создать DataSet, а проассоциировать с созданным во ViewModel, но как?-->
        <CollectionViewSource x:Key="db1DataSet" Source="{Binding Path=db1DataSet, Source={StaticResource MainWinViewModel}}"/>
        
        <CollectionViewSource x:Key="usersViewSource" Source="{Binding Path=Users, Source={StaticResource db1DataSet}}" />
        
    </Window.Resources>
    
    <Grid DataContext="{StaticResource usersViewSource}">
        <DataGrid AutoGenerateColumns="True" 
                  EnableRowVirtualization="True" 
                  ItemsSource="{Binding}" 
                  Name="usersDataGrid" 
                  RowDetailsVisibilityMode="VisibleWhenSelected"/>
    </Grid>
</Window>


Не понимаю как из XAML достучаться до DataSet, когда в секции ресурсов окна создаётся не сразу экземпляр DataSet (как автоматом при перетаскивании таблицы), а экземпляр ViewModel. Наверняка кто-то сталкивался с такой же ситуацией?
...
Рейтинг: 0 / 0
02.08.2012, 16:51
    #37902314
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вынести DataSet и пр. во ViewModel ?
...
Рейтинг: 0 / 0
13.08.2012, 11:51
    #37914208
Old_Fat_Cat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вынести DataSet и пр. во ViewModel ?
Получается, что надо (другие варианты не пошли):
1/ Экземпляр ViewModel объявлять в C# коде View, а не в XAML.
2/ Контекст данных указывать в C# коде View, а не в XAML
3/ Контекст данных указывать непосредственно для визуального элемента
4/ Контекстом данных может быть или DataSet или таблица в нём.
5/ Тогда в XAML для привязки указывать соответственно или {Binding Path=таблица} или сам контекст {Binding}
6/ Вариант с контекстом данных = ViewModel и с {Binding Path=myDataSet.MyTable} не проканал. Вариант с объявлением контекста в старших родительских элементах не проканал. Вариант с объявлением соответствующено ресурса для окна и использованием его в визуальном элементе с Path=xxx.yyy не проканал.

Получается как-то так:
Код: xml
1.
2.
3.
4.
5.
<DataGrid AutoGenerateColumns="True" 
                  EnableRowVirtualization="True" 
                  ItemsSource="{Binding Path=Users}"
                  Name="usersDataGrid" 
                  RowDetailsVisibilityMode="VisibleWhenSelected"/>


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public partial class MyWindow : Window
    {
        public MyWindowViewModel MyWinVM;
        
        public MainWindow()
        {
            InitializeComponent();
            MainWinVM=new MyWindowViewModel() ;
            this.usersDataGrid.DataContext = MyWinVM.dbDataSet;
        }
    }
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как вынести DataSet и пр. во ViewModel ? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]