none
Как получить данные из ObjectDataProvider, используемого для привязки в окне? RRS feed

  • Вопрос

  • Начну с того, что у меня в приложении WPF есть экземпляр ADO.NET DataTable (назовём его myTable), определённый как данное-член класса главного окна приложения. В приложении также есть модальное окно, содержащее WPF DataGrid. При визуализации модального окна, я отображаю в его DataGrid содержимое myTable следующем образом. Определяю открытое свойство для досткпа к myTable по чтению.

    /// <summary>
    /// Возвращает таблицу myTable.
    /// </summary>
    public static DataTable MyTable
    {
         get { return myTable; }
    }

    Определяю класс MyDataProvider:

    public class MyDataProvider
    {
         /// <summary>
         /// Предоставляет данные из таблицы myTable.
         /// </summary>
         /// <returns>Представление таблицы по умолчанию</returns>
         public DataView GetMyTable()
         {
               return MainWindow.MyTable.DefaultView;
         }
    }

    В разметке модального окна, в котором отображаю содержимое myTable пишу:

    <Window ...
       xmlns:local="...
        ....
       <Window.Resources>
            <ObjectDataProvider x:Key="MyDataProvider" ObjectType="{x:Type local:MyDataProvider}"/>
            <ObjectDataProvider x:Key="MyData" ObjectInstance="{StaticResource ResourceKey=MyDataProvide}" MethodName="GetMyTable"/>
       </Window.Resources> 
        .......
       <DataGrid Name="dgNice" ... ItemsSource="{Binding Source={StaticResource MyData}}">
        .......
       </DataGrid>
    .....
    </Window>

    Всё отображается, все хорошо. Но. Можно ли здесь каким-нибудь образом извернуться и, по закрытию модального окна по клавише OK, сделать LINQ из содержимого ObjectDataProvider? Сам ObjectDataProvider не определяет ни IEnumerable ни IQuerable. Но ADO.NET DataTable, представление по умолчанию которой возвращается методом MyDataProvider.GetMyTable(), определяет IEnumerable. Може здесь можно как-нибудь "подлезть" и получить данные из провайдера? С классом сущностей я тогда весной сделал- получилось неплохо. А вот тут вот как?


    • Изменено TownSparrow 6 сентября 2012 г. 11:15
    6 сентября 2012 г. 11:12

Ответы

  • Всё, вроде разобрался. DataTable можно достать.

    System.Windows.Data.ObjectDataProvider MyData = ((System.Windows.Data.ObjectDataProvider)(this.FindResource("MyData")));
    System.Data.DataTable tempDataTable = ((System.Data.DataView)MyData.Data).Table;

    А по DataTable можно и foreach(){} и LINQ сделать.

    Вопрос снимаю.

    • Помечено в качестве ответа TownSparrow 6 сентября 2012 г. 12:39
    6 сентября 2012 г. 12:39

Все ответы

  • Всё, вроде разобрался. DataTable можно достать.

    System.Windows.Data.ObjectDataProvider MyData = ((System.Windows.Data.ObjectDataProvider)(this.FindResource("MyData")));
    System.Data.DataTable tempDataTable = ((System.Data.DataView)MyData.Data).Table;

    А по DataTable можно и foreach(){} и LINQ сделать.

    Вопрос снимаю.

    • Помечено в качестве ответа TownSparrow 6 сентября 2012 г. 12:39
    6 сентября 2012 г. 12:39
  • Спасибо за решение. Действительно в WPF доступ к ресурсам приложения можно получить через FindResource или this.Resources["myKey"]

    Для связи [mail]

    7 сентября 2012 г. 12:10