« first day (847 days earlier)      last day (2184 days later) » 

5:16 AM
@VladD везде пишут, что нет такого функционала, печально... Например: stackoverflow.com/q/164645/6766879
 
5:57 AM
@VladD вообщем я сделал SnapsToDevicePixels="True", оно помогло, но не во всех случаях. Вот например смотри:
@VladD вот, я еще вопросик задал, но я так понимаю, мне врядли там ответят:(
 
6:18 AM
@VladD вот, взгляни на углы. Неужели это нельзя пофиксить?
 
7:14 AM
@Bretbas а как же MCVE? =)
 
7:47 AM
@Bretbas где-то в неправильном месте вы вопрос задали
 
@Андрей возможно дело не в месте, а в формулировке вопроса?
 
@FoggyFinder ну, по хорошему, конечно, надо выкинуть все лишнее и оставить только тот кусок, в котором проблема
 
@Андрей Я Вам писал вопрос вчера этот. Там весь код связанный, поэтому нельзя было выкинуть что-либо
но на счет углов, и пикселей на бортах Border'а я не писал..
 
8:05 AM
@Bretbas а что такое BackgroundCarrotLight?
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" и Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
@Bretbas ^ попробуйте так
 
 
2 hours later…
9:46 AM
0
Q: Взаимодействие между двумя и более ViewModel

BretbasДоброго времени суток, Господа. Прошу помочь мне в моем спаггети-коде и разложить все по полочкам. Суть следующая: Есть окно, в этом окне есть два контрола - Menu и Frame. Также имеется страница Page, которая указана в Frame. Меню представляет из себя выбор категорий, а страница, которая отобража...

>а что такое BackgroundCarrotLight?
Цвет такой
>
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)" и Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
а что место SolidColorBrush писать? что то я вообще не могу понять эту конструктцию
у меня цвет берется из статик ресурсов
 
так и оставить или у вас другая кисть?
 
@Bretbas Хм. А где проблема?
Подожди, дай свангую.
 
@VladD о привет:)
 
А не подключаешь ли ты VM случайно через XAML?
@Bretbas Привет!
 
@VladD проблем много на самом деле, и там и здесь...везде вообщем;)
понемногу так сказать
@VladD Нет, VM подсоединяется за счет базового класса BasePage<VM>
 
9:52 AM
То есть, не пишешь ли ты
<Page.DataContext>
    <vm:MyVM/>
</Page.DataContext>
Ааааа!
 
не
 
Ну то есть View сама себе создаёт VM
 
    VM viewModel;
    public VM ViewModel
    {
        get {  return viewModel; }
        set
        {
            if( viewModel == value )
                return;

            viewModel = value;
            this.DataContext = viewModel;
        }
    }

    public BasePage()
    {
        ViewModel = new VM();
    }
 
правильно?
 
Да
Блин, ну смотри:)
 
9:53 AM
Да, так вот это неправильно и это корень проблемы
 
public class BasePage<VM> : Page where VM : BaseViewModel, new()
{
    VM viewModel;
    public VM ViewModel
    {
        get {  return viewModel; }
        set
        {
            if( viewModel == value )
                return;

            viewModel = value;
            this.DataContext = viewModel;
        }
    }

    public BasePage()
    {
        ViewModel = new VM();
    }
}
вот базовый класс для страниц
от него наследую страницы
 
Во-первых, это против MVVM
 
разве?
 
View не имеет права создавать себе VM
Конечно
Это просто не его компетенция
 
хм... а кто тогда должен это делать?
 
9:54 AM
Потому что View не может правильно связать VM
Сейчас найду какой-нибудь скелет, момент
 
если View не может создавать себе VM, то как же так, я вижу почти в каждом примере, что окно создает в конструкторе VM и передает ее в свой контекст
 
Для начала вот:
10
A: Точка входа в MVVM: App.xaml.cs или представление?

VladDЯ предпочитаю не использовать StartupUri, а переопределять OnStartup, и создавать главное окно там ([1], [2], [3]). Причина в том, что указание StartupUri не позволяет задать DataContext снаружи окна. А хардкодирование DataContext'а внутри XAML неправильно, так как: Согласно паттерну MVVM, Vie...

И ссылки оттуда
А я пошёл завтракать пока :)
@Bretbas Да, потому что писать правильно долго
Так что для краткости примера делают неправильно
 
Я почитаю пока что
 
Давай! Я вернусь и поговорим об этом
 
ок
 
9:57 AM
Вот тут костяк:
9
A: Игра на WPF, переносим код WinForms в MVVM

VladDДавайте пойдём сначала. Построим VM. Нам пригодится базовый класс для VM, в котором будет имплементация INotifyPropertyChanged: class VM : INotifyPropertyChanged { protected bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null) { ...

 
@Bretbas не так много людей (если они вообще есть) всегда следуют всем принципам MVVM да и даже там часто сойтись не могут, так что я бы на вашем месте не сильно переживал если где-то вы не следуете какому-то паттерну
 
@FoggyFinder ну просто дело в том, что такую задачу, которую решаю я, уже сделали давно, и додумали, что так будет правильно. Вот я и хочу узнать, как правильно:)
 
mvvm это не единственный из возможных вариантов
 
10:15 AM
@FoggyFinder какие есть еще варианты? Можно на событиях все написать:)
@VladD что то я не понял. Ты предлагаешь установить VM окна внешне, в переопределенном методе OnStartup(..) класса class App : Application
 
@VladD канешн
 
Ну хорошо, я это сделаю, а дальше то что?:)
мне кажется базовый класс для страниц, с установкой VM через параметр дженерика, довольно красиво выглядит: class BasePage<VM> : Page where VM : BaseViewModel, new()
@VladD можно конечно VM моего меню положить в VM моей страницы, и уже будет легче
Но я бы хотел меню сделать более глобальное
 
@Bretbas Да.
 
может быть будут еще страницы, где это же меню должно висеть
 
@Bretbas Смотри. Для начала, приложение должно работать вне зависимости от того, подключен ли к нему UI
Ну за исключением того, что нету user input'а
Поэтому VM должны быть самодостаточными
Стартовая VM с окном связывается при старте
 
10:28 AM
@VladD ну так они у меня самодостаточные
 
Например, в App.xaml.cs
 
ага
 
@Bretbas Не, не самодостаточные
Потому что они не связаны между собой
Значит, они надеются, что их свяжет View
 
под самодостаточностью я понимаю то, что они ни от кого не зависят
и это так
 
Самодостаточные в смысле «не зависящие от View», а не «не зависящие друг от друга»
 
10:29 AM
ну у меня так и есть
 
между собой они могут иметь зависимости, и даже должны
 
вот
как это сделать?:)
 
вот у меня в последнем примере связь между VM получилась тривиально
потому что корневая VM создаёт вложенные VM
и передаёт им в конструкторе всё, что нужно
хоть Action, хоть ссылку на себя
что угодно
а если VM создавать изолированно, то понятно, что им будет сложно между собой общаться, и придётся подставлять уродливые костыли
вот
 
ну у меня корневая VM - это VM окна. В этой VM содержится VM меню. Но вот остальные VM, а именно VM'ы страниц, создаются отдельно
 
А вот пусть не создаются отдельно
Пусть их создаёт либо MainVM, либо какое-то центральное место типа App.xaml.cs, которое сумеет их правильно связать
 
10:32 AM
А кто тогда должен их создавать?
 
Ну это задача VM-уровня, вот пусть VM-уровень их и создаёт
Я бы попробовал сделать так, чтобы их создавала MainVM
 
Хорошо, допустим я нашел, как связать VM страницы и VM меню. Что должна знать VM страницы о VM меню? Только CurrentCategory или вообще ссылку иметь на VM менб?
 
Соответственно вся игра с VMBase<T> становится не нужна
@Bretbas А это в зависимости от того, что ей надо
тут вопрос вырождается в такой:
у нас есть десяток классов, как они должны быть связаны?
и он за рамками MVVM
это обычный дизайн классов
 
Можно сделать AppViewModel и получать его с помощью IoC
 
@Bretbas Ааааа! Зачем?
 
10:35 AM
в нем будет все что нужно другим VM'ам
 
Зачем делать сложно, когда можно просто передать нужное в конструкторе?
 
Что ты подразумеваешь под "Нужным"
Понимаешь дело в чем
вот смотри
у меня есть VM страницы
 
Я бы не тянул тяжёлый фреймворк типа IoC только ради того, чтобы создавать объекты отдельно.
Пустой конструктор (без параметров) обычно зло
@Bretbas Так.
Есть, хорошо.
 
VM страиницы должна обновлять список изделий, в зависимости от того, изменился ли пункт меню или нет
 
@Bretbas Ну, то, что нужно для корректного функционирования.
 
10:36 AM
но VM меню отдельно
 
@Bretbas Хорошо, да.
 
мне в VM страницы передать весь объект VM меню?
 
@Bretbas Что значит «отдельно»?
 
ну он не внутри VM страницы находится
 
@Bretbas Если нужен весь объект — передавай весь, а в чём проблема?
Если нужен не весь, а только часть информации из него, передавай эту часть
 
10:37 AM
Как то не красиво
>Если нужен не весь, а только часть информации из него, передавай эту часть
 
Почему не красиво? А городить IoC, и класть по сути все объекты в глобальные переменные — красиво? По-моему, уродливо.
@Bretbas Объект должен обладать минимальными знаниями о мире, которых ему достаточно для нормального функционирования
 
получается я передаю ссылку на CurrentMenuItem из VM меню в VM страницы. Если это свойство измениться в VM меню, то оно измениться и VM странице
 
@Bretbas Ну например так.
 
Как то все очень легко получается
 
Или у VM страницы есть ссылка на меню
 
10:39 AM
странно даже
 
@Bretbas Ну так.
Если делать правильно, всё становится легко
В этом и смысл
Делать правильно нужно не потому, что это предписано кем-то, а потому что так делать легко.
 
Смотри еще
у меня есть вот такой класс
public class PageNavigator : BaseViewModel, IPageNavigator
{
	private Dictionary<Type, Page> pages = new Dictionary<Type, Page>();
	private Stack<Page> historyPages = new Stack<Page>();

	Page currentPage;
	public Page CurrentPage
	{
		get => currentPage;
		set => Set( ref currentPage, value );
	}

	public void NextPage<T, U>( U data )
	{
		var page = (Page)Activator.CreateInstance( typeof( T ), this, data );
		CurrentPage = page;

		historyPages.Push( page );
	}
	public void NextPage<T>()
	{
		var page = (Page)Activator.CreateInstance( typeof( T ), this );
Это мой навигатор для перехода между страницами
 
Угу
 
вот к примеру как я открываю первую страницу
PageNavigator.NextPage<ProductListPage>();
 
Это часть View или VM? Я не в курсе.
 
10:43 AM
Это не VM и не View
это отдельный класс
 
Окей
Решение о переходе между страницами — обязанность VM
 
Суть в том, что страницам, при переходе, необходимы данные
 
Так что будем считать, что это связка
 
да я знаю
Итак
 
А почему не так: PageNavigator.NextPage<ProductListPage>(productListVM);?
 
10:45 AM
Да стой ты:)
можно и так:)
 
Стою :)
 
Но мне так понравится BasePage<VM> что я не хочу пока расставаться с ним:)
мы выяснили, что VM страницы нужно передать как то VM меню, но VM меню находится в VM окна
итак, просто делаем вот так и все
PageNavigator.NextPage<ProductListPage>(MenuVM);
ProductListPage - он наследуется от BasePage<ProductListViewModel>
так что ProductListPage уже знает о своей VM.
но она хочет знать еще и о VM меню
как тебе идея?:)
 
@Bretbas Почему бы и нет?
 
Все тогда
 
Хотя стой.
 
10:48 AM
так и делаю
 
Подожди секунду
 
е-мое, что не так?:)
 
Смотри, а кто будет создавать ProductListViewModel? И кто её будет подвязывать к остальным?
PageNavigator?
Он справится со связыванием?
Если да, то хорошо
 
ProductListPage - он наследуется от BasePage<ProductListViewModel>
BasePage - внутри создает VM
ProductListViewModel
 
Не, ну Page же у нас больше не создаёт свою VM у нас, правильно?
Не-не-не, это против MVVM, давай так не делать
 
10:50 AM
:(
 
Не дело вьюхи создавать VM
 
Ну тогда PageNavigator пусть создает?
 
А чем плохо, если её будет создавать PageNavigator?
Воооот!
Он её и настроить сможет правильно
А Page не сможет
 
void NextPage<T, VM, Data>( Data data ) : where T : Page, where VM:BaseViewModel
получается так
3 параметр дженерика - это данные
которые нужно передавать между страницами
все мне пора
у нас обед
Я может позже зайду
Надо валить
 
Давай, приятного!
@Bretbas Угу, ну три так три
 
10:53 AM
Спасибо:) посмотри вот это
 
Возможно, это значит, что у PageNavigator'а слишком много ответственностей, и его придётся порезать на части. Но это позже.
@Bretbas Ага, сейчас гляну.
@Bretbas Небось анимируешь глобальный объект?
Да, он замораживается
Ща посмотрю поподробнее
Ага, так и есть
Я поэксперментирую попозже
по поводу того, что можно сделать
 
 
4 hours later…
2:51 PM
@FoggyFinder спасибо, почитаю на досуге
@VladD короче я сделал чтобы ViewModel'ы моих страниц, передавались через PageNavigator. Я сделал у VM моего меню событие, которого генерируется, когда свойство SelectedItemMenu изменилось.
Потом передаю объект VM меню как данные странице ProductListViewModel через PageNavigator: PageNavigator.NextPage<ProductListPage, ProductListViewModel, MenuViewModel>( MenuVM ); Там, внутри метода NextPage, создается страница ProductListPage, создается объект ProductListViewModel и передается как контекст только что созданной страницы ProductListPage. Также, в конструктор ProductListViewModel передается объект MenuViewModel
В конструкторе происходит подпись на событие SelectedMenuItemChanged, которое я добавил.
В обработчике этого события уже идет обновление списка изделий и всякая другая ерунда связанная с VM страницы изделий
 
3:15 PM
@Bretbas Угу, то, что надо. Ну или можно было подписываться на INPC и фильтровать по имени (что наверное не насколько хорошо).
 

« first day (847 days earlier)      last day (2184 days later) »