none
Привязка в WPF RRS feed

  • Вопрос

  • Может кто знает как привязать WPF TextBox к ADO.NET DataColumn. Короче, мне нужно привязать вэпээфовский TextBox, находящийся в ячейке грида в окне, к полю таблицы (ADO.NET DataTable). Спасибо заранее. Евгений.
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:08 MSDN Forums Consolidation (От:Технологии .NET Framework: ADO.NET, WCF, WPF etc)
    16 июня 2010 г. 19:11

Ответы

  • <DataGridTextColumn x:Name="dogColumn" Binding="{Binding Path=Dog}" Header="Dog" Width="SizeToHeader" />

    • Помечено в качестве ответа I.Vorontsov 18 июня 2010 г. 6:25
    17 июня 2010 г. 4:52
    Модератор
  • Спасибо, попробую.
    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:56
    17 июня 2010 г. 18:46
  • Спасибо, но оказывается мой случай немножко другой. Мне нужно не сеточное (т.е. табличное) представление - нет. У меня - TextBox находится в гриде просто как в контейнере и пользовательский интерфейс должен показывать в этом текстбоксе значение определенного поля из одного выбранного ADO.NET DataRow. Пускай, предположим, это будет DataRow из отфильтрованного, с помощью DefaultView, DataTable'а. Я не буду здесь приводить разметку - она у меня довольно большая по объему, а опишу вкрадце пользовательский интерфейс, реализованный разметкой. И так: WINDOW, в нем основной GRID, в его первой строке - WRAP PANEL, которая содержит несколько элементов, и, в том числе, GRID, состоящий из определенного числа строк и колонок. В ячейках этого грида сидят, в частности, TextBox'ы, в каждом из которых должна отображаться информация из одного из полей (CELL) DataRow, выбранного, предположим с помощью фильтрации, из DataTable. Пробовал делать нечто вроде следующего:

    Binding myBinding = new Binding();
    myBinding.Source = myTable;
    myBinding.Path = new PropertyPath(myTable.Columns["colSweetheartName"]);
    myBinding.Mode = BindingMode.TwoWay;
    myWindow.myTEXTBOX.SetBinding(TextBox.TextProperty, myBinding);

    В итоге, при визуализации окна myWindow (привязка динамическая, поэтому я ее и делаю в коде, а не в разметке), генерируется исключение InvalideOperationException, сообщающее, что DataColumn не является свойством зависимостей и такую привязку делать нельзя.

    Парни, вы уж меня извините, что надоедаю, но я в WPF еще начинающий новичок. Может кто что еще раз подскажет касательно вышеописанного случая с текстбоксами. Т.е. текстбоксы должны отображать информацию из полей какой-то одной строчки таблицы.

    Буду благодарен.

    Евгений.

    P.S. Как подобная вещь легко делалась в добрые стародавние времена на старом добром Delphi вер.5. Но я хочу идти в ногу со временем и считаю, что MS Visual Studio и WPF - это достойные инструменты и их необходимо освоить.

    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:56
    19 июня 2010 г. 9:18
  • Спасибо большое, попробую, а то я уже, честно сказать, здорово намучился. Спасибо.
    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:17
    20 июня 2010 г. 4:42
  • Похоже работает. Я сделал так:

    // MyView это объект класса BindingListCollectionView он у меня член класса окна,

    // я извлекаю его выше по ходу дела и использую для нескольких нужд,

    // а здесь применяю в частности.

    Int32 KeyValue = (Int32)(((DataRowView)MyView.CurrentItem)["colPKey"]);
    MyView.CustomFilter = "colPKey = " + KeyValue.ToString();

    myWindow.myTextBox.DataContext = myDataTable.DefaultView;
    Binding myBinding = new Binding("colSweetheartName");
    myBinding.Mode = BindingMode.TwoWay;
    myWindow.myTextBox.SetBinding(TextBox.TextProperty, myBinding);

    Т.е.

    1) Получаю первичный ключ таблицы из выбранной записи (через ListView, привязанный к таблице - отсюда и BindingListCollectionView MyView).

    2) Через MyView.CustomFilter фильтрую (по первичному ключу) DefaultView у таблицы myDataTable. Отфильтровал -это точно, сам прослеживал.

    3) Затем привязываюсь к отфильтрованному DefaultView.

    Все работает. В смысле TextBox привязан к нужному полю. Но! Несмотря на то, что я привязался к отфильтрованному myDataTable.DefaultView, при вводе в текстбокс значения, оно записывается хотя и в нужное поле, но не в отфильтрованную запись, а в физически первую записи в таблице, которая даже не попадает в условие фильтрации. Почему так? Подскажите, пожалуйста. Буду очень благодарен.

    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:55
    • Снята пометка об ответе Eugene_Buzin 20 июня 2010 г. 16:01
    • Помечено в качестве ответа Eugene_Buzin 26 июня 2010 г. 2:23
    20 июня 2010 г. 6:50

Все ответы

  • <DataGridTextColumn x:Name="dogColumn" Binding="{Binding Path=Dog}" Header="Dog" Width="SizeToHeader" />

    • Помечено в качестве ответа I.Vorontsov 18 июня 2010 г. 6:25
    17 июня 2010 г. 4:52
    Модератор
  • Спасибо, попробую.
    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:56
    17 июня 2010 г. 18:46
  • Спасибо, но оказывается мой случай немножко другой. Мне нужно не сеточное (т.е. табличное) представление - нет. У меня - TextBox находится в гриде просто как в контейнере и пользовательский интерфейс должен показывать в этом текстбоксе значение определенного поля из одного выбранного ADO.NET DataRow. Пускай, предположим, это будет DataRow из отфильтрованного, с помощью DefaultView, DataTable'а. Я не буду здесь приводить разметку - она у меня довольно большая по объему, а опишу вкрадце пользовательский интерфейс, реализованный разметкой. И так: WINDOW, в нем основной GRID, в его первой строке - WRAP PANEL, которая содержит несколько элементов, и, в том числе, GRID, состоящий из определенного числа строк и колонок. В ячейках этого грида сидят, в частности, TextBox'ы, в каждом из которых должна отображаться информация из одного из полей (CELL) DataRow, выбранного, предположим с помощью фильтрации, из DataTable. Пробовал делать нечто вроде следующего:

    Binding myBinding = new Binding();
    myBinding.Source = myTable;
    myBinding.Path = new PropertyPath(myTable.Columns["colSweetheartName"]);
    myBinding.Mode = BindingMode.TwoWay;
    myWindow.myTEXTBOX.SetBinding(TextBox.TextProperty, myBinding);

    В итоге, при визуализации окна myWindow (привязка динамическая, поэтому я ее и делаю в коде, а не в разметке), генерируется исключение InvalideOperationException, сообщающее, что DataColumn не является свойством зависимостей и такую привязку делать нельзя.

    Парни, вы уж меня извините, что надоедаю, но я в WPF еще начинающий новичок. Может кто что еще раз подскажет касательно вышеописанного случая с текстбоксами. Т.е. текстбоксы должны отображать информацию из полей какой-то одной строчки таблицы.

    Буду благодарен.

    Евгений.

    P.S. Как подобная вещь легко делалась в добрые стародавние времена на старом добром Delphi вер.5. Но я хочу идти в ногу со временем и считаю, что MS Visual Studio и WPF - это достойные инструменты и их необходимо освоить.

    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:56
    19 июня 2010 г. 9:18
  • Попробуй так.

    Binding myBinding = new Binding("colSweetheartName");
    myWindow.myTEXTBOX.SetBinding(TextBox.TextProperty, myBinding);
    
    

    • Предложено в качестве ответа ulcerModerator 20 июня 2010 г. 11:25
    19 июня 2010 г. 18:23
    Модератор
  • Спасибо большое, попробую, а то я уже, честно сказать, здорово намучился. Спасибо.
    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:17
    20 июня 2010 г. 4:42
  • Похоже работает. Я сделал так:

    // MyView это объект класса BindingListCollectionView он у меня член класса окна,

    // я извлекаю его выше по ходу дела и использую для нескольких нужд,

    // а здесь применяю в частности.

    Int32 KeyValue = (Int32)(((DataRowView)MyView.CurrentItem)["colPKey"]);
    MyView.CustomFilter = "colPKey = " + KeyValue.ToString();

    myWindow.myTextBox.DataContext = myDataTable.DefaultView;
    Binding myBinding = new Binding("colSweetheartName");
    myBinding.Mode = BindingMode.TwoWay;
    myWindow.myTextBox.SetBinding(TextBox.TextProperty, myBinding);

    Т.е.

    1) Получаю первичный ключ таблицы из выбранной записи (через ListView, привязанный к таблице - отсюда и BindingListCollectionView MyView).

    2) Через MyView.CustomFilter фильтрую (по первичному ключу) DefaultView у таблицы myDataTable. Отфильтровал -это точно, сам прослеживал.

    3) Затем привязываюсь к отфильтрованному DefaultView.

    Все работает. В смысле TextBox привязан к нужному полю. Но! Несмотря на то, что я привязался к отфильтрованному myDataTable.DefaultView, при вводе в текстбокс значения, оно записывается хотя и в нужное поле, но не в отфильтрованную запись, а в физически первую записи в таблице, которая даже не попадает в условие фильтрации. Почему так? Подскажите, пожалуйста. Буду очень благодарен.

    • Помечено в качестве ответа Eugene_Buzin 20 июня 2010 г. 6:55
    • Снята пометка об ответе Eugene_Buzin 20 июня 2010 г. 16:01
    • Помечено в качестве ответа Eugene_Buzin 26 июня 2010 г. 2:23
    20 июня 2010 г. 6:50
  • Все, несколько дней назад нашел и сделал. Использовал не DefaultView, а создавал DataView на основе исходной таблицм, фильтровал его и с полем фильтрованного DataView связывал TextBox по сценарию, который предложил мне ULCER. Все получается. Спасибо большое за помощь.

    С уважением  Евгений.

    26 июня 2010 г. 7:10