last day (15 days later) » 

14:37
2
Q: Изменить значение TextBox, который находится в ItemsControl

Mark TwainУ меня есть TextBox, значение которого меняется при нажатии на кнопку в VM. <ItemsControl ItemsSource="{Binding InputList}" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Tag="{Binding AddCalculateCommand}"> TextBox, который находится в ItemControl <TextBox Grid.Column="2" Grid.Row="0" Marg...

А код где? С одним XAML далеко не уедешь. Сделайте минимальный и самодостаточный пример пожалуйста.
Добавил код VM.
Почему вы привязываете команду к тегу? Почему бы не привязывать сразу к команде? Я про это место: Command="{Binding Tag,, пишите просто {Binding DataContext.AddCalculateCommand или где там у вас команда. Также я на вашем месте не делал бы что-то на подобие get { return calculationDesignModel.InputList; } Как по мне, лучше сделать событие, которое оповестит о том, что в модели появилось что то новое и в VM его уже обрабатывать. Сейчас вы вечно дергаете коллекцию из модели. Ну и также, давайте код CalculationDesignModel, будем смотреть что в нем.
Простая привязка к команде не работает в ItemsControl, поэтому выполнил ее через Tag.
Ну почему тогда у меня работает, а у вас нет? Наверно потому, что вы делаете что-то не так, верно? Хорошо, не суть. Вот ваше свойство ValueInVariable, вы его привязали, вы его изменяете, хорошо, но где INPC? От куда View слою знать, что оно обновилось? Вообще в вашей Model все свойства можно заменить на простой {get;set;}, зачем выносить приватные поля для этого, если внутри нет какой либо логики?
14:37
но ведь View связана с VM с помощью DataContext = new CalculateViewModel();
INPC реализовано в классе BaseModel, который является родительским для моей VM
Да без разницы где у вас реализован INPC. Вот создайте метод, напишите там вывод какого либо текста, без обращения к этому методу он выведет этот текст? Также и тут, у вас где-то есть реализация INPC, которая имеет метод OnPropertyChanged(), вот его вам надо вызывать внутри set свойства, которое будет изменяться через код. Как только вы его вызываете - View слой понимает "Ага, там есть обновления, пойду обновлять интерфейс". Без него, он не получает подобных команд!
По поводу DataContext я что-то не понял, к чему это было сказано...
но у меня же есть реализация OnPropertyChanged в set свойстве C# public ObservableCollection<CalculationDesignModel> InputList { get { return calculationDesignModel.InputList; } set { calculationDesignModel.InputList = value; OnPropertyChanged("InputList"); } }
А значит при изменении значения должно происходит изменение в View
Если я в чем-то не прав, приведите, пожалуйста, правильный пример кода
Ваш код выше будет отвечать только за InputList = new OvservableCollection..., только на изменение этого свойство, не более. Вы же, меняете свойство объекта внутри (InputList[index].ValueInVariable = Trunk.Result;, а конкретно - ValueInVariable. Есть у него INPC? Я не вижу. ВСЕ свойства, которые будут по мере выполнения приложения изменяться программно (через код), должны вызывать INPC!
что я должен прописать тогда в OnPropertyChanged()?
я же не могу просто передать в OnPropertyChanged("InputList[index].ValueInVariable")
Как тогда правильно передать значение?
Так, давайте по порядку.
- Вы делаете привязку к `ItemsSource="{Binding InputList}"`.
- Ваш лист, это `ObservableCollection<CalculationDesignModel> InputList`.
- CalculationDesignModel на сколько я понял, это тот код, что у вас помечен в вопросе, как `Model`.
- Дальше, вы привязываете TextBox к `Text="{Binding ValueInVariable}`, то есть свойство `ValueInVariable` внутри `CalculationDesignModel`.
- Смотрим на это свойство: `public string ValueInVariable { get => valueInVariable; set => valueInVariable = value; }`.
Где вы тут увидели INPC тогда вопрос?
14:43
INPC сам в ViewModel
Но это привязанное свойство его не вызывает
Оно должно быть как свойство, которое у вас рядом с командой:
public string ValueInVariable
{
get { return calculationDesignModel.ValueInVariable; }
set
{
calculationDesignModel.ValueInVariable = value;
OnPropertyChanged("ValueInVariable");
}
}
Только прописанное в Model?
ну конечно, вы же этот объект привязываете
Ура, ваш способ помог мне.
Большое вам спасибо.
Разрешите задать еще несколько вопросов связанных с MVVM и WPF
Вообще я вам советую сделать отдельную VM обертку для CalculationDesignModel, ибо привязываться к модели не есть хорошо. Хотя если там не будет какой либо логики или чего то еще, то можно и так оставить.
Задавайте
14:47
Если не привязываться к модели, то откуда получать эти переменные?
И какая например логика может содержаться в этой самой модели
Просто на сколько я понимаю модель служить для связи с бд
А какая там может быть логика не понимаю
Просто следуйте принципу MVVM, Есть Model, есть View, есть ViewModel, свяжите View с ViewModel и берите от туда всё, что нужно, не просто же так это всё придумали
Как уже было выше сказано, использовать Model в DataContext не лучший вариант
Помните, что Model ничего не должна знать о ViewModel, ViewModel должна управлять ей
View -> ViewModel -> Model, в обратную сторону это не работает, а если у вас работает, то советую всё переделать
Что тогда должно происходит вообще в моей модели?
Ничего, модель просто существует, чтобы хранить какие-то данные
Происходит всё обычно во ViewModel
Значит я должен создавать переменные в VM и передавать их в Model, чтобы они там хранились?
Не совсем понял о чем вы
Создавать модели вы должны во ViewModel, если вы про это
14:55
Можно пример?
Смотрите, к примеру у нас есть класс "Человек".
Он имеет свойства
- "Имя"
- "Возраст"
- "Id"
- Методы для получения каких то данных с сервера, сохранение может этих данных.
Все это Model. Что из этого всего может нам пригодиться в ViewModel?
Помним, да, что VM слой создан для того, что бы вывести что то или обработать что то в View слое.
Например нам надо вывести список всех пользователей, просто их имена и возраст. Нужны ли нам Id, методы работы с сервером или что то еще? Я думаю что нет.
Все ViewModel человека будет содержать в себе всего 2 свойства, это:
Упс, вот сообщение выше подробнее всё рассказало
Значит ли это, что в VM будут выбраны только нужные переменные и реализованы команды. Методы для работы с этими данными пишутся в Model?
Не совсем, если, например, вам надо будет загрузить какие-то данные о модели, то это делать нужно не в модели, а во ViewModel
Модель это просто модель, она не должна, по сути, нести в себе никакой логики
По поводу логики вы совершенно не правы.
15:00
Например, у меня есть метод сохранения введенных данных в PDF файл. Правильнее его реализовать в Model?
Нет
да...
Как прийти к истине?
Model - данные, их обработка (например база данных это модель, все методы по работе с ней должны быть в модели).
ViewModel - прослойка, между Model и View, которая содержит в себе ИСКЛЮЧИТЕЛЬНО то, что необходимо View слою (команды, различные свойства для отображения и что то еще).
View - это цвета, стиль, кнопочки и все остальное.
Хотя да, вы правы, лучше засунуть в модель
15:04
Если ваш метод имеет логику по работе с View объектами (например метод обработки команды клика) - его место в ViewModel слое
Если ваш метод никак не относиться к View слою (например отправка запроса на удаленный сервер, чтение файла или еще что) - его место в Model
а правильно ли привязывать к textbox поле типа string, а потом для математического расчета уже писать Convert.ToDouble(string) и так с ним и уже работать или есть способ правильнее?
Если у вас там хранится только число, то никто не запрещает вам сделать биндинг к числовому св-ву
WPF сама преобразует .ToString() и обратно привязанные свойства, так что да, просто привязывайтесь к int.
Можете литературу грамотную посоветовать по MVVM
15:19
Я как-то спрашивал по поводу модели у VladD и вот что он мне написал:
https://i.sstatic.net/khBxP.png
https://i.sstatic.net/bYJ8H.png
По поводу литературы - увы, подсказать не могу, лишь дать ответ с содержанием всех полезных книг по c#, которое собирает сообщество. Ну а так, могу посоветовать то, на чем я познавал все это - SO и AngelSix (YouTube), ну и гугл)
49
Q: Книги и учебные ресурсы по C#

VladDВопросы о литературе по различным языкам программирования возникают очень часто. Здесь мы попробуем собрать лучшие ответы и рекомендации насчёт литературы и других учебных ресурсов по языку C#, платформе и популярным библиотекам. Не забывайте, однако, что никакая теория не заменит опыта программ...


last day (15 days later) »