|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Я для окна (View) установил контекст моей VM, в которой есть объект MyObj определенного класса. Биндинг ко всем контролам окна я делаю так: MyObj.Name , MyObj.SubName и т.д. Так же для этой View есть несколько DataTemplate, которые выбираются в зависимости от выбранного элемента комбобокса: Код: xml 1.
В самих DataTemplat'ах биндинг тоже указываю аналогичным образом: MyObj.DocDate, MyObj.DocNum и т.д. Код: xml 1. 2. 3. 4. 5. 6.
1) Но биндинг в DataTemplate не работает - как указать ему VM? Идеально не в каждом биндигне писать конструкция, типа поиск контекста окна и т.д., а как-то один раз. 2) Если мне понадобится эти шаблоны данных применить в другой View, с другой VM, где будет объект того же класса MyObject, но называться, к примеру, SelectedObj - как выйти из положения, что я уже указал имя объекта MyObj в шаблоне? Может можно как-то указать VM и имя объекта? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 12:24 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Честно говоря, очень путано объяснил, я мало что понял. С одной стороны, ты говоришь, что в модели окна есть объект MyObj (свойство этого типа, надо полагать) С другой стороны, ты говоришь, что для окна существует несколько шаблонов ("для окна (View).... для этой View"), тогда где находится комбобокс, и почему в приведенном примере шаблона DataType=MyObject, а не модель окна? Если же у тебя DocDate и DocNum - это свойства типа local:MyObject, то зачем ты пишешь в биндинге MyObj? У тебя же в контексте уже MyObject, следовательно писать надо просто Код: xml 1. 2.
в общем, для лучшего понимания надо более развернутый пример ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 12:38 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Попробую немного расширить пример. Вот модель данных: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Вот ViemModel: Код: c# 1. 2. 3. 4. 5.
Устанавливаем для окна ViewModel: Код: c# 1. 2. 3. 4. 5.
Вот так в окне я делаю биндинг: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
А шаблон данных для меня - это как бы "вырезанная часть" такого грида с контролами для включения при выборе в комбобоксе: Код: xml 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 12:57 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Как я уже сказал выше, если у тебя DataTemplate нацелен на тип MyData, у него никак не может быть в контексте свойства MyObject, к которому ты пытаешься обратиться, потому что MyObject - это свойство MyViewModel, а в шаблон "знает" только про свойства MyData и обращаться к ним нужно напрямую ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:02 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe12) Если мне понадобится эти шаблоны данных применить в другой View, с другой VM, где будет объект того же класса MyObject, но называться, к примеру, SelectedObj - как выйти из положения, что я уже указал имя объекта MyObj в шаблоне? Может можно как-то указать VM и имя объекта?Соответственно, этот вопрос перестает иметь смысл, так как шаблон относится только к типу MyData, независимо от того, в каком свойстве какого объекта он хранится ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:04 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Логично. Убрал MyObject из шаблона, но студия пишет BindingExpression path error. Откуда в шаблон будут подставляться данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:16 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Откуда в шаблон будут подставляться данные? Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:24 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Так заработало, единственный момент: в шаблоне данных, при таком подходе, нет доступа к ВьюМодели. А у меня в ней есть свойство Код: c# 1.
которое определяет стиль всех Тексбоксов: ReadOnly или нет (в зависимости от того, нажал ли пользователь кнопку Редактировать в окне). Чтобы доступ ко вьюмодели остался я делал так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Тогда надо оставить в биндинге в шаблоне все как было (MyObject.DocDate и т.д.). Но тогда идет завязка на имя объекта MyObject (п. 2 вопроса). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:42 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Логично сделать свойство IsEditMode внутри MyData ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:46 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Тут ты должен мыслить в подходах обычной инкапсуляции - ты выделяешь класс MyData, который будет использоваться в разных контекстах. Родитель зависит от MyData, но MyData никак не должен зависеть от родителя, иначе начинается спагетти-код. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:50 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Подумаю, спасибо. Правда свойства типа IsEditMode, с моей точки зрения, чисто ВьюМодельные и в данные MyData, которые я считываю из БД, они не очень подходят... Этот момент пока не знаю как обыграть. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:55 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Если ты выделяешь отдельный шаблон для MyData, то MyData автоматически становится вьюмоделью. Если ты хочешь еще сильнее разделить слои, то делай еще одну вьюмодель, в которой MyData будет всего лишь свойством. Но большого смысла в этом я не вижу ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 13:58 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Правда свойства типа IsEditMode, с моей точки зрения, чисто ВьюМодельныену как сказать. Например можно запретить сохранение модели в базу при IsEditMode=false, так сказать, страхуясь от ошибки программиста при дальнейшем рефакторинге. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2019, 14:00 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
А нельзя сделать как-то так? Тогда данные в шаблоне не будут знать о VM, но хотя бы так можно было бы задать ReadOnly? Код: xml 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 10:31 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Я бы сделал новую ВьюМодель: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 11:35 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1А нельзя сделать как-то так? Тогда данные в шаблоне не будут знать о VM, но хотя бы так можно было бы задать ReadOnly?Это, в общем, плохая затея, потому что если захочется потом на какой-то текстбокс функционал навесить (какой-нить подкрашивающий стиль), стиль по умолчанию работать перестанет. А так как ты редактируешь шаблон для MyData, ты не знаешь (как бы), что тебе навязывается какой-то функционал извне. Это особенно проявляется, когда проект большой или над ним работают несколько разрабов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2019, 11:39 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Супер_Пав Может быть своя ВьюМодель и неплохая идея, только вот перечислять все поля в ней не очень хочется. Shocker.Pro А у меня так и не получилось переопределить стиль. Не в ресурсах ContentPresenter'а, не если обернуть его StackPanel'ю и для не задать ресурсы со стилями Текстбокса. У меня другой вопрос: раньше я ID выбранного в комобосоке элемента использовал для DataSelector'а, теперь у меня используется MyObject: Код: xml 1.
Я делаю так и при смене элемента комбобокса контент (шаблон) не меняется. То есть при открытии окна шаблон выбирается, а при смене в комобоксе значений - уже нет. Почему? Код: xml 1.
Во вью-модели: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 12:56 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Может быть своя ВьюМодель и неплохая идея, только вот перечислять все поля в ней не очень хочется.А зачем? У тебя один фиг представление зависит сейчас от MyData. Так что ты не ухудшишь ситуацию, если новая модель будет содержать свойства типа IsReadOnly и целиком объект MyData в каком-то поле. Вряд ли тебе нужны для него OnPropertyChanged ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 13:16 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1У меня другой вопрос: раньше я ID выбранного в комобосоке элемента использовал для DataSelector'а, теперь у меня используется MyObject:Селектор шаблона для конкретного элемента имеет на входе сам шаблонизируемый объект и только. То есть шаблон выбирается в зависимости от состояния объекта. Таким образом, тебе выбранный в комбобоксе элемент нужно привязать на некоторое свойство объекта MyData. Ну либо как-то по-другому подойти к вопросу выбора шаблонов. К примеру, сделать шаблоны элементами комбобокса и напрямую назначать в ContentPresenter без всяких промежуточных TemplateSelector-ов ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 13:20 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Вроде бы так и делаю, установил для комбобокса SelectedValue на свойство ViewModel'и SelectedDocTypeID , при выборе значения - я попадаю в сеттер, где делаю OnPropertyChanged("MyObject"); подразумевая, что ContentPresenter выберет другой шаблон, но ничего не происходит. Хотя если указать SelectedDocTypeID в качестве контента ContentPresenter, то я захожу в связанный TemplateSelector. То есть реакция есть. При чем SelectedDocTypeID и MyObject - два свойства одной и той же VM. Почему так? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 14:51 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Еще предыдущее сообщение пришлось напрячься, чтобы понять. А теперь Шаляпин на пальцах. Код давай, короче )) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 15:04 |
|
DataTemplate и ViewModel
|
|||
---|---|---|---|
#18+
Qwe.Qwe1- я попадаю в сеттер, где делаю OnPropertyChanged("MyObject"); подразумевая, что ContentPresenter выберет другой шаблон, но ничего не происходит.возможно потому, что реально объект не заменился. Попробуй присвоить свойству null, а потом опять объект... хотя это костыль, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2019, 15:18 |
|
|
start [/forum/topic.php?fid=21&msg=39775124&tid=1440348]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 273ms |
0 / 0 |