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

Windows Properties in MVVM

02.07.2022, 18:56. Показов 2082. Ответов 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
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.07.2022, 18:02  [ТС]
Элд Хасп, ок, спасибо. Попробую.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru