[WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 02.12.09 14:41
Оценка:
Ребят, не могли бы вы помочь с WPF, плиз? Какое-то оно мощное до вычурности, что логика не помогает.
Кратенько: классическая БД морда — окно с гридом + формы редактирования. Есть коллекции ORM элементов List<T>,
которую я отображаю в гриде через ItemsSource.
Где затыка: при добавлении элементов в List<T>, я хочу руками вызывать метод UpdateTarget,
чтобы тот обновил грид (т.е. мне нет необходимости во всяких obesrvable). Однако, это метод BindingExpression'а, который у меня и не получается добыть.

Итак, сорсы

ХАМЛ:
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="gridData" IsReadOnly="True">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Title" Binding="{Binding Title}"/>
    <DataGridTextColumn Header="Size" Binding="{Binding Size}"/>
    <DataGridCheckBoxColumn Header="Beautiful?" Binding="{Binding IsBeautiful}"/>
  </DataGrid.Columns>
</DataGrid>

C#:
В конструкторе формы:
gridData.ItemsSource = lst;// lst - мои List<T>. Пробовал gridData.DataContext = lst; - тоже работает!


По кнопке Add:
((List<T>)gridData.ItemsSource).Add(newItem);
var be = gridData.GetBindingExpression(DataGrid.ItemsSourceProperty);// вот этот be почему-то null!
be.UpdateTarget();// срываемся по null


В сети нашёл именно такое решение, но наверное где-то напортачил в XAML?...
Заранее спасибо.
Re: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 02.12.09 14:53
Оценка: +1
Здравствуйте, matumba, Вы писали:

M>В конструкторе формы:

M>gridData.ItemsSource = lst;// lst — мои List<T>. Пробовал gridData.DataContext = lst; — тоже работает!
Нужно именно gridData.DataContext = lst. Иначе у тебя никакого Binding'а в ItemsSource нет.
Re[2]: [WPF] Как добраться к UpdateTarget?
От: Codechanger Россия  
Дата: 02.12.09 17:50
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>Здравствуйте, matumba, Вы писали:


M>>В конструкторе формы:

M>>gridData.ItemsSource = lst;// lst — мои List<T>. Пробовал gridData.DataContext = lst; — тоже работает!
MK>Нужно именно gridData.DataContext = lst. Иначе у тебя никакого Binding'а в ItemsSource нет.


Еще помогает CollectionViewSource.GetDefaultView(lst).Refresh(), в принципе..
Re[2]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 11:24
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>Нужно именно gridData.DataContext = lst. Иначе у тебя никакого Binding'а в ItemsSource нет.


Спасибо, сработало! BindingExpression теперь живой, но UpdateTarget почему-то не работает. (если интересно, кинул проект на рапиду)

И ещё вопросик: а в чём отличие (научное) DataContext от ItemsSource? В сети ходят такие мутные документы, что понять сложно.

Здравствуйте, Codechanger, Вы писали:

C>Еще помогает CollectionViewSource.GetDefaultView(lst).Refresh(), в принципе..


Спасибо, Codechanger, работает!! Надо же, какие дебри нужно знать... Хех, а что же помешало этому UpdateTarget??
Re[3]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 11:28
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Еще помогает CollectionViewSource.GetDefaultView(lst).Refresh(), в принципе..


И сейчас чистослучайно нашёл: gridData.Items.Refresh(); — тоже работает!! Хотя казалось бы, причём тут Items и Refresh?...
Re[3]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 03.12.09 12:08
Оценка:
Здравствуйте, matumba, Вы писали:

M>И ещё вопросик: а в чём отличие (научное) DataContext от ItemsSource? В сети ходят такие мутные документы, что понять сложно.

DataContext задает источник данных для Binding по умолчанию.
ItemsSource задает список, по которому ItemsControl генерирует свое содержимое.

Просто часто так оказывается, что ItemsSource часто биндится на что-то, и поэтому его можно спутать с DataContext, но вообще это два совершенно разных свойства.

M>Здравствуйте, Codechanger, Вы писали:

C>>Еще помогает CollectionViewSource.GetDefaultView(lst).Refresh(), в принципе..
M>Спасибо, Codechanger, работает!! Надо же, какие дебри нужно знать... Хех, а что же помешало этому UpdateTarget??
Я вот сейчас подумал. Помешало скорее всего то, что объект, присвоенный ItemsSource по факту не изменился. Ты изменил содержимое списка, добавив туда элемент, но ссылка на сам список какая была, такая и осталась. Поэтому grid решил, что значение свойства не поменялось и забил на обновление.
Re[4]: [WPF] Как добраться к UpdateTarget?
От: Codechanger Россия  
Дата: 03.12.09 12:10
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Codechanger, Вы писали:


C>>Еще помогает CollectionViewSource.GetDefaultView(lst).Refresh(), в принципе..


M>И сейчас чистослучайно нашёл: gridData.Items.Refresh(); — тоже работает!! Хотя казалось бы, причём тут Items и Refresh?...


Items фактически является ссылкой на CollectionView, созданный при биндинге коллекции к ItemsControl.

Когда вы биндите любую коллекцию на ItemsSource, для нее автоматически создается дефолтный CollectionView(Например, ListCollectionView).ItemsControl внутри себя работает с этим CollectionView.Советую почитать про это побольше.
Re: [WPF] Как добраться к UpdateTarget?
От: Vladek Россия Github
Дата: 03.12.09 12:11
Оценка:
Здравствуйте, matumba, Вы писали:

M>Ребят, не могли бы вы помочь с WPF, плиз? Какое-то оно мощное до вычурности, что логика не помогает.


Вот они — рендеринг текста исправили, теперь будут плодить WPF-монстров! Что через год, конечно же, благоприятно скажется на рынке труда.

Читать до посинения: ItemsControl: A to Z и WPF’s CollectionViewSource.
Re[5]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 03.12.09 12:44
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Когда вы биндите любую коллекцию на ItemsSource, для нее автоматически создается дефолтный CollectionView(Например, ListCollectionView).ItemsControl внутри себя работает с этим CollectionView.Советую почитать про это побольше.

Вот это и вводит в заблуждение Не обязательно биндится на коллекцию, она может быть просто присвоена. DataContext-Binding и ItemsSource-CollectionView — это разные механизмы.

P.S. Не, я понимаю, что ты понимаешь. Это я для топикстартера пояснил
Re[5]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 13:09
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Когда вы биндите любую коллекцию на ItemsSource, для нее автоматически создается дефолтный CollectionView(Например, ListCollectionView).ItemsControl внутри себя работает с этим CollectionView.Советую почитать про это побольше.


MxKazan> Не обязательно биндится на коллекцию, она может быть просто присвоена. DataContext-Binding и ItemsSource-CollectionView — это разные механизмы.

Ребят, тогда не могли бы вы поделиться, где толково и детально описан этот механизм биндингов? (вот именно про эти DataContext-Binding, ItemsSource-CollectionView).
Можно просто название книг, можно ссылками. Я скачал уже штуки 4 книжек, но понять где вода, а где толково написано, чайнику сложно, а читать сразу всё — немыслимо.

Я уже что-то читал про связку контрол-вью-коллекция, но источники варьируются от 2006 до 2009 и попадаются какие-то личноблоги а-ля "я попробовал и оно работает!". Ужасное начало для фундаментального обучения.
Re[2]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 13:32
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Вот они — рендеринг текста исправили, теперь будут плодить WPF-монстров!


эээ... а кто "они"?

V>Читать до посинения: ItemsControl: A to Z и WPF’s CollectionViewSource.


Спасибо, Vladek, уже читаю. Страница с CollectionViewSource смущает вот этим:
So, why did we add CollectionViewSource?
The main reason was to enable those view-related operations in XAML

Т.е. у нас уже есть контрол-вью-список, но эта модель не ложится под XAML — давайте прикрутим костыль! Он тоже будет сортировать, но уже через теги. Вас не смущают подобные архитектурные изыски?
Re[3]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 03.12.09 13:47
Оценка:
Здравствуйте, matumba, Вы писали:

M>Т.е. у нас уже есть контрол-вью-список, но эта модель не ложится под XAML — давайте прикрутим костыль! Он тоже будет сортировать, но уже через теги. Вас не смущают подобные архитектурные изыски?

Что значит "тоже"? Кто сказал, что исходный список отсортирован как нам надо?
Re[4]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 14:00
Оценка:
Здравствуйте, MxKazan, Вы писали:

MK>Здравствуйте, matumba, Вы писали:


M>>Т.е. у нас уже есть контрол-вью-список, но эта модель не ложится под XAML — давайте прикрутим костыль! Он тоже будет сортировать, но уже через теги. Вас не смущают подобные архитектурные изыски?

MK>Что значит "тоже"? Кто сказал, что исходный список отсортирован как нам надо?

"Тоже" — значит, что мы уже имеем эту функциональность, но только через код. Цитата:

All of these features already existed in WPF before we decided to add CollectionViewSource.
We could already do filtering, sorting, grouping, we could track and set the current
item, we could retrieve the default view created by WPF and manipulate it, and we could
manually create multiple views of the same collection.
Re[5]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 03.12.09 14:22
Оценка:
Здравствуйте, matumba, Вы писали:

M>"Тоже" — значит, что мы уже имеем эту функциональность, но только через код. Цитата:

Ну, а если я не хочу через код это делать?
Re[6]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 03.12.09 14:33
Оценка:
Здравствуйте, MxKazan, Вы писали:

M>>"Тоже" — значит, что мы уже имеем эту функциональность, но только через код. Цитата:

MK>Ну, а если я не хочу через код это делать?

Значит существующие View-классы должны поддерживать разметку XAML. Никто же не изобретает ButtonSource для того, чтобы прочесть свойства Button из тегов?
Вообще, мы несколько уходим в оффтопик.
Сходу отличий DataContext от ItemsSource я не уловил, может вы пишете слишком кратко или не совсем точно?
Если нам достаточно источника данных, указанного через DataContext, почему же в ХАМЛе постоянно мельтешит ItemsSource?
Re[7]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 03.12.09 14:44
Оценка:
Здравствуйте, matumba, Вы писали:

M>Значит существующие View-классы должны поддерживать разметку XAML. Никто же не изобретает ButtonSource для того, чтобы прочесть свойства Button из тегов?

Какие существующие view-классы? Я могу просто IEnumerable использовать. Предлагаешь внести поддержку фильтрации в IEnumerable?

M>Вообще, мы несколько уходим в оффтопик.

M>Сходу отличий DataContext от ItemsSource я не уловил, может вы пишете слишком кратко или не совсем точно?
M>Если нам достаточно источника данных, указанного через DataContext, почему же в ХАМЛе постоянно мельтешит ItemsSource?
Ключевое выделено. Попробуй присвоить только DataContext, без ItemsSource
Re[3]: [WPF] Как добраться к UpdateTarget?
От: Vladek Россия Github
Дата: 03.12.09 18:45
Оценка:
Здравствуйте, matumba, Вы писали:

V>>Вот они — рендеринг текста исправили, теперь будут плодить WPF-монстров!

M>эээ... а кто "они"?

Новички, переходящие на WPF сейчас и не тратящие время на её изучение.

M>Т.е. у нас уже есть контрол-вью-список, но эта модель не ложится под XAML — давайте прикрутим костыль! Он тоже будет сортировать, но уже через теги. Вас не смущают подобные архитектурные изыски?


Нет, не смущают, потому что выбор есть: пользоваться CollectionViewSource, пользоваться наследниками CollectionView, написать свою реализацию ICollectionView.
Re[4]: [WPF] Как добраться к UpdateTarget?
От: matumba  
Дата: 04.12.09 07:16
Оценка:
Здравствуйте, Vladek, Вы писали:

V>>>Вот они — рендеринг текста исправили, теперь будут плодить WPF-монстров!

M>>эээ... а кто "они"?
V>Новички, переходящие на WPF сейчас и не тратящие время на её изучение.

А! То есть то, что я профессионально программирую 15 лет — это ерунда, а стоило задать нетривиальный вопрос по новой для меня технологии, так я вообще чмо, так что ли?
Владек, вы сами — чмо и пожалуйста, если чешется язык, полижите у себя в другом месте.
А если вам хочется справедливого суждения, поясню: писал до этого на WinForms, сейчас поставили проект с WPF, который я изучаю одновременно с написанием кода. Времени на студенческое трындение нет, на "метод тыка" тоже. Поэтому ваше бахвальство не иначе как дебильным назвать не могу. Чуточку уважения к коллегам у вас есть?

M>>Т.е. у нас уже есть контрол-вью-список, но эта модель не ложится под XAML — давайте прикрутим костыль! Он тоже будет сортировать, но уже через теги. Вас не смущают подобные архитектурные изыски?

V>Нет, не смущают, потому что выбор есть: пользоваться CollectionViewSource, пользоваться наследниками CollectionView, написать свою реализацию ICollectionView.
Понятно. Увидел деревья, про лес забыл.

PS
Ко всем читающим, пожалуйста, даже если вам ну ОЧЕНЬ прёт прижать новичка, просто подумайте: ну насрёте человеку в душу, что, умнее станете что ли? Да, есть и лень, есть и чайниковость, но если вам так лениво отвечать, зачем вообще сотрясать форум? А если можете чем помочь, но банально лень, укажите хотя бы конкретный источник, где эта проблема описана. Одна ссылка и всего делов, зачем разводить персональный срач? Не так очевидны все эти "новшества" от мелкософт, потому и вопросов тысячи. Была бы одна ХОРОШАЯ дока, никто и вопросов не задавал бы, но сейчас по основам WPF лежит сплошное фуфло. Даже мне, начинающему, очевидна поверхностность многих "руководств". Вобщем, надежда только на опыт и профессионализм форумчан.
Re[5]: [WPF] Как добраться к UpdateTarget?
От: MxKazan Португалия  
Дата: 04.12.09 07:51
Оценка:
Здравствуйте, matumba, Вы писали:

M>Ко всем читающим, пожалуйста, даже если вам ну ОЧЕНЬ прёт прижать новичка, просто подумайте: ну насрёте человеку в душу, что, умнее станете что ли? Да, есть и лень, есть и чайниковость, но если вам так лениво отвечать, зачем вообще сотрясать форум? А если можете чем помочь, но банально лень, укажите хотя бы конкретный источник, где эта проблема описана. Одна ссылка и всего делов, зачем разводить персональный срач? Не так очевидны все эти "новшества" от мелкософт, потому и вопросов тысячи. Была бы одна ХОРОШАЯ дока, никто и вопросов не задавал бы, но сейчас по основам WPF лежит сплошное фуфло. Даже мне, начинающему, очевидна поверхностность многих "руководств". Вобщем, надежда только на опыт и профессионализм форумчан.

Да не прет. И не прижимает никто, кстати. Просто мы тебе пытаемся разъяснить, что да как, а ты почему-то вместо того, чтобы попытаться въехать, сразу начинаешь писать про костыли, да про замудрённость.

Но я таки предлагаю вернуть вопрос в нужное русло Попробовал присвоить присвоить только DataContext, без ItemsSource? Чего получилось?
Re[5]: [WPF] Как добраться к UpdateTarget?
От: Codechanger Россия  
Дата: 04.12.09 08:06
Оценка:
Здравствуйте, matumba, Вы писали:

M>А! То есть то, что я профессионально программирую 15 лет — это ерунда, а стоило задать нетривиальный вопрос по новой для меня технологии, так я вообще чмо, так что ли?

M>Владек, вы сами — чмо и пожалуйста, если чешется язык, полижите у себя в другом месте.
M>А если вам хочется справедливого суждения, поясню: писал до этого на WinForms, сейчас поставили проект с WPF, который я изучаю одновременно с написанием кода. Времени на студенческое трындение нет, на "метод тыка" тоже. Поэтому ваше бахвальство не иначе как дебильным назвать не могу. Чуточку уважения к коллегам у вас есть?

А у вас есть? Просто вы задаете вопросы, ответы на которые давались уже не один десяток раз. Опять же, большинство функционала и архитектуры WPF очень подробно описаны в MSDN. Ваш вопрос про DataContext и ItemsSource показал, что вы, даже толком не прочитав про биндинги, DependencyPropeties, ItemsControl и т.д., сразу ринулись в бой с ВинФормс подходом к программированию на WPF. Так вот. Как человек, начинавший с MFC, поработавший на ВинФормс плотно и перешедший на WPF, скажу — переход просто не дается. Подобного рода вопросы у вас будут возникать, пока вы не поменяете концепцию мышления при проектировании кода и не начнете мыслить в терминах WPF. Я, честно говоря, боюсь представить, как вы сможете воспринять некоторые трюки и подходы, которые в WPF являются обыденным явлением(например, обход визуального дерева) просто потому, что с таким в WinForms вы никогда не сталкивались. Опять же, называть человека чмом и просить его где-то там полизать как-то не настраивает на доверительное и дружелюбное общение, как, впрочем, и показывает уровень общей культуры и интеллектуального развития. Хотите пофлеймить и пооскорблять — вам в СВ, тут же извольте принять тот факт, что на вопросы, которые считаются(и по сути являются) глупыми, вам по сто раз никто отвечать не будет. Максимум зададут направление для дальнейших поисков.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.