Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3

Windows Properties in MVVM

02.07.2022, 18:56. Показов 2117. Ответов 24
Метки mvvm, wpf (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте коллеги!
Вопрос такой: можно ли как-то не влезать в CB View при работе с Properties?
То есть, я хочу сохранять размеры и позицию окна у каждого конкретного пользователя в его %APPDATA%.
Для этих целей в модели главного окна реализованы свойства:
C#
1
2
3
4
5
6
7
8
        #region Windows Position Properties
        private double top, left, height, width;
 
        public double WTop { get => top; set => Set( ref top, value ); }
        public double WLeft { get => left; set => Set( ref left, value ); }
        public double WHeight { get => height; set => Set( ref height, value ); }
        public double WWidth { get => width; set => Set( ref width, value ); }
        #endregion
и методы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        #region Window Position Methods
        public void LoadWindowPosition()
        {
            WTop = Settings.Default.WTop;
            WLeft = Settings.Default.WLeft;
            WHeight = Settings.Default.WHeight;
            WWidth = Settings.Default.WWidth;
        }
 
        public void SaveWindowPosition()
        {
            Settings.Default.WTop = WTop;
            Settings.Default.WLeft = WLeft;
            Settings.Default.WHeight = WHeight;
            Settings.Default.WWidth = WWidth;
            Settings.Default.Save();
        } 
        #endregion
В конструкторе модели, разумеется, вызываем метод загрузки свойств:
C#
1
        public MainWindowViewModel() => LoadWindowPosition();
В разметке главного окна подключена данная VM:
XML
1
2
3
    <Window.DataContext>
        <vm:MainWindowViewModel x:Name="MainViewModel" />
    </Window.DataContext>
ну и свойства окна:
XML
1
2
3
4
5
6
7
8
9
10
11
        <!-- ...... -->
        Top="{Binding WTop}"
        Left="{Binding WLeft}"
        Height="{Binding WHeight}" 
        Width="{Binding WWidth}"
        MinHeight="250" 
        MinWidth="700"
        Style="{StaticResource ExtWindowStyle}"
        ResizeMode="CanResize"
        Loaded="Window_Loaded"
        Closed="Window_Closed">
Так вот, как видно, для окна применены события Loaded и Closed для загрузки и сохранения этих данных, соответственно, эти события пришлось прописать в CB главного окна:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        #region Window Position
        private void Window_Loaded( object sender, RoutedEventArgs e )
        {
            MainViewModel.LoadWindowPosition();
            Top = MainViewModel.WTop;
            Left = MainViewModel.WLeft;
            Height = MainViewModel.WHeight;
            Width = MainViewModel.WWidth;
        }
 
        private void Window_Closed( object sender, EventArgs e )
        {
            MainViewModel.WTop = Top;
            MainViewModel.WLeft = Left;
            MainViewModel.WHeight = Height;
            MainViewModel.WWidth = Width;
            MainViewModel.SaveWindowPosition();
        } 
        #endregion
    }
От сюда вопрос - вроде бы при таком подходе отпадает надобность использования этих свойств во ВьюМодели окна, с другой стороны, каким образом впихивать эти значения в окно при загрузке, используя наиболее абстрагированный подход, не влезая в CB окна?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2022, 18:56
Ответы с готовыми решениями:

MVVM Button Content Properties работает не правильно
Всем привет. Задача очень простая, при нажатии на кнопку менять Content на другой кнопке, но это не происходит ViewModel ...

WPF MVVM Combobox Properties.Settings.Default
Подскажите плиз, пытаюсь сохранить значение комбобокса при выборе, в настройки, но при повторном открытии присваивается ноль вот код VM: ...

Можно ли в Properties.Resources или Properties.Settings сохранить объект object
Хочу в приложении сделать окошко редактирования настроек. Так вот Можно ли в Properties.Resources или Properties.Settings сохранить...

24
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
03.07.2022, 16:15  [ТС]
Студворк — интернет-сервис помощи студентам
На данный момент сделал так:
XAML
XML
1
2
3
4
5
        Top="{Binding Source={x:Static properties:Settings.Default}, Path=WTop, Mode=TwoWay}"
        Left="{Binding Source={x:Static properties:Settings.Default}, Path=WLeft, Mode=TwoWay}"
        Height="{Binding Source={x:Static properties:Settings.Default}, Path=WHeight, Mode=TwoWay}" 
        Width="{Binding Source={x:Static properties:Settings.Default}, Path=WWidth, Mode=TwoWay}"
        Closed="Window_Closed">
MainWindow.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        #region Window Position Save
        private void Window_Closed( object sender, EventArgs e )
        {
            Settings.Default.Save();
        }
        
        public class SettingBindingExtension : Binding
        {
            public SettingBindingExtension() => Initialize();
            public SettingBindingExtension( string path )
                : base( path ) => Initialize();
            private void Initialize()
            {
                Source = Settings.Default;
                Mode = BindingMode.TwoWay;
            }
        }
        #endregion
    }
Пока оставим так, все работает. Но идеи по улучшению приветствуются.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
12.07.2022, 14:57
Цитата Сообщение от wizard41 Посмотреть сообщение
А привязка только в одну сторону работает, почему-то... Т.е. при изменении положения/размера окна эти данные в Settings не пишутся..
У меня всё работает без проблем.
Все значения нормально сохраняются между сеансами приложения:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Window x:Class="Core2022.SettingsBinding.SettingsBindingWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Core2022.SettingsBinding"
        xmlns:stts="clr-namespace:Core2022.Properties"
        mc:Ignorable="d"
        Title="SettingsBindingWindow"
        Width="{Binding MainWidth, Source={x:Static stts:Settings.Default}, Mode=TwoWay}"
        Height="{Binding MainHeight, Source={x:Static stts:Settings.Default}, Mode=TwoWay}"
        Left="{Binding MainLeft, Source={x:Static stts:Settings.Default}, Mode=TwoWay}"
        Top="{Binding MainTop, Source={x:Static stts:Settings.Default}, Mode=TwoWay}"
        Closed="OnClosed">
    <Grid>
        
    </Grid>
    <x:Code>
        <![CDATA[
        private void OnClosed(object sender, EventArgs e)
        {
          Properties.Settings.Default.Save();
        }
        ]]>
    </x:Code>
</Window>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
12.07.2022, 15:16
Лучший ответ Сообщение было отмечено wizard41 как решение

Решение

wizard41, с
Цитата Сообщение от wizard41 Посмотреть сообщение
SettingBindingExtension
С кастомным классом привязки тоже нормально работает, но дизайнер выдаёт предупреждения.
Чтобы их не было - изменил реализацию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public class SettingBindingExtension : Binding
    {
        public SettingBindingExtension()
            : this(".")
        { }
        public SettingBindingExtension(string path)
        {
            Path = new PropertyPath(path);
            Source = Properties.Settings.Default;
            Mode = BindingMode.TwoWay;
        }
    }
После этого всё нормально работает и в Дизайнере, и в рунтайм:
XML
9
10
11
12
13
14
        Title="SettingsBindingWindow"
        Width="{local:SettingBinding MainWidth}"
        Height="{local:SettingBinding  MainHeight}"
        Left="{local:SettingBinding  MainLeft}"
        Top="{local:SettingBinding  MainTop}"
        Closed="OnClosed">
Добавлено через 8 минут
Чтобы не создавать свой метод для сохранения, можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public class SettingBindingExtension : Binding
    {
        public SettingBindingExtension()
            : this(".")
        { }
        public SettingBindingExtension(string path)
        {
            Path = new PropertyPath(path);
            Source = Properties.Settings.Default;
            Mode = BindingMode.TwoWay;
        }
 
        static SettingBindingExtension()
        {
            Application.Current.Exit += (_, _) => Properties.Settings.Default.Save();
            timer = new System.Threading.Timer(_ => Properties.Settings.Default.Save(), null, 10_000, 10_000);
        }
 
        private static readonly System.Threading.Timer timer;
    }
Тогда обработчик закрытия окна не нужен.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
12.07.2022, 18:02  [ТС]
Элд Хасп, ок, спасибо. Попробую.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
12.07.2022, 18:08
wizard41, таймер - на случай аварийного прерывания приложения (свет вырубили, например).
Делает автосохранение настроек каждый 10 секунд.

Добавлено через 2 минуты
wizard41, можно добавить ещё валидатор на присвоение значения и сделать в нём сохранение, при любом присвоении по привязке.
Но мне кажется таймера и сохранения при выходе достаточно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2022, 18:08

Как в log4j.properties вставить параметр из application.properties
У меня в log4j.properties имеется вот такая строка: log4j.appender.file.File=D:\\Project\\logging.log Для меня это немного не...

Настройка быстрого доступа к Connection Properties в Windows 7
Данный материал в основном для тех, кому приходится часто менять настройки IP адреса на сетевом адаптере в компе, по мере трудовой...

Windows Phone MVVM
Может ли кто-нибудь поделиться простым примером MVVM приложения, к примеру щелкаешь на окно, а он выдает в отдельном TextBlock координаты....

Рисую линию без MVVM все ОК. C MVVM произвольный старт
Добрый день всем. Рисую линию при помощи анимации. Все получилось -рисуется, стирается. Но у нас все задания с MVVM, чтобы ViewModel...

Применяют ли паттерн MVVM в XNA Windows Phone приложениях?
Применяют ли паттерн MVVM в XNA Windows Phone приложениях(тип приложения без Silverlight)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru