Лучший отвечающий
Привязка в WPF

Вопрос
-
Может кто знает как привязать 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