Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 11.07.2026
Сообщений: 12

Странно, но после SelectedItems.Clear, в SelectedItems по прежнему осталась таже строка

11.07.2026, 15:51. Показов 3491. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всё должно было быть коротко:
C#
1
private ClsReg CurrentDocItem => lbDoc.SelectedItem as ClsReg;
Но я уже месяц и так, и этак писал. Вот в данный момент о меня такое написано.
C#
1
2
3
4
5
6
7
8
9
10
11
   private ClsReg CurrentDocItem {
         get {
            if(lbDoc.SelectedIndex == -1) {
               lbDoc.Items.Clear();
               lbDoc.SelectedItem = null;
               var x = lbDoc.SelectedItems.Count; 
            }
 
            return lbDoc.SelectedIndex == -1 ? null : lbDoc.Items[lbDoc.SelectedIndex] as ClsReg;
         }
      }
Здесь «lbDoc» это ListBox. У него SelectionMode="Single". Я, как вы видите, и Items.Clear() сделал, и lbDoc.SelectedItem обнулил, но lbDoc.SelectedItems.Count по прежнему возвращает 1. Как так получается? Как я могу это сотворить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2026, 15:51
Ответы с готовыми решениями:

Привязка к ListBox SelectedItems
Есть простой ListBox с мультиселектом: ListBox SelectionMode="Multiple"...

Правильное отображение selectedItems в Combobox
Всем привет, работаю по MVVM Есть Объект - Object Два свойства - Value1, Value2 -> string Во...

Отладка работы ListView SelectedItems
В проекте есть ListView, при загрузке из базы данных устанавливается IsSelected разным элементам...

51
0 / 0 / 0
Регистрация: 11.07.2026
Сообщений: 12
15.07.2026, 11:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Судя по предыдущим сообщениям вы явно не понимаете что такое MVVM, разделение ответственности, асинхронность (не обязательно много поточность) и т.д.
Уж так я устроен, что начиная понимать нечто общепринятое, я постепенно перехожу к частностям, конечно теряя общность. Это было бы явной ошибкой в большой компании, но я по сути дела одиночка. Так что я явно понимая суть MVVM на практике работаю в более удобном для меня, а не для всех, режиме. Да, MVVM прекрасно разделил всё на логику, представление и на связь между ними. Но это же самое делалось и раньше. Начиная от памяти компьютера. Вот здесь расположен сегмент данных, в котором разрешено вносить изменения, и сегмент кода, в котором нельзя копаться. Я понимаю, что это сейчас звучит как маразм, в времена, когда был только MASM это было важно. И я поддерживая такое разделение в принципе, на практике не следую MVVM во всем. Возможно, в данном случае, я что-то не правильно сделал. Во всём C# «экспериментатор» типа меня может сотворить что-то, что в голову его создателей не приходило.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому советую всё же вам прибегнуть к первому варианту, если у вас не огромное решение.
Увы, это весьма огромное решение. Грубо говоря это перевод документа из XLS в Oracle. Для меня это просто новая переписка существующего инструмента. Но для вас это собственный пакет для работы с Oracle (написанный на основе «официального» Oracle), и пакет для работы с XLS, тоже с перепиской со своим взглядом на это. И все это ради одного окна, в котором странно ведет себя один ListBox?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Второй же вариант - это в том числе и вам самому нужен.
Правильно. но Вы же раньше написали
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сделайте минимальный пример, как я в своём ответе, который конкурентно вашу ошибку локализует и демонстрирует.
Сделав это, я сам приду к выводу о причине, которую я локализовал.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для примера посмотрите мой ответ здесь WPF (.NET 8) XAML cannot resolve namespaces, converters, ViewModels despite classes being public.
Посмотрю обязательно.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну я тоже 66г. Уже стукнуло недавно 60.
Надеюсь не 14 июня.

Добавлено через 12 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Разницу чувствуете между тем что у вас и у меня?
Наверняка почувствую, когда скачаю к себе и попробую разобраться. Пока что меня пугают слова типа «IKSGONZListWindowVM». Кто такой «KSGONZ» непонятно. И скорее всего VS сообщит мне что-то о версии не моей, или об отсутствие «KSGONZ». Но я попробую, но не сегодня.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.07.2026, 11:09
Цитата Сообщение от Vgal Посмотреть сообщение
И я поддерживая такое разделение в принципе, на практике не следую MVVM во всем.
Дело не только в MVVM.
Основной механизм взаимодействия WPF элеметов с данными - это Привязки (Binding). И хотя это ОДНОПОТОЧНЫЙ механизм работающий в UI потоке, но это в тоже время и АССИНХРОННЫЙ механизм, который позволяет задавать значение свойствам элементов не вмешиваясь в процесс рендеринга.
А по вашим сообщениям с большой вероятностью проблема именно в этом.

В нормальном режиме, замена коллекции ItemsSource или её очистка (если это ObservableCollection) или очистка SelectedItems автоматически должны приводить к к SelectedItem=null и SelectedIndex=-1.
Так как у вас не используются привязки, то сохраняться в кеше старым значениям просто негде.
Но у вас этого не происходит, значит вы явно в какой-то нестандатный, неправильный момент производите операции по очистке.
Кроме того между очисткой коллекции и сбросом SelectedItem=null и SelectedIndex=-1 должно пройти время. Так как не всегда эти операции выполняются в одном фрейме UI потока.
Поэтому и говорят что в UI элементах нельзя хранить данные. Под этим подразумевается, что "истинные данные" должны храниться в отдельном слое. UI элементы их только представляют. И это представление "в моменте" может отличаться от настоящих данных. В большинстве случаев для GUI задержака 20-50мс - это нормальное и частое явление. А для "истинных данных" даже наносекудные задержки могут привести к проблемам.

Вот такие особенности (не только и это) и вызвали необходимость разработки паттерна MVVM. То есть это не "выдумки яйцеголовых", а ответ на особенности реализации приложения с GUI на XAML платформе.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
15.07.2026, 11:34
Цитата Сообщение от Vgal Посмотреть сообщение
когда скачаю к себе и попробую разобраться
Это просто часть кода из моего приложения, и VS вам про него ничего не расскажет. Я показал как взаимодействуют слои, в VM определяются свойства с которыми работает VM, а View к этим свойствам привязывается и по привязкам обновляет отображение. При этом *.xaml.cs этого окна абсолютно пустой. Всё происходит через работу со свойствами VM - а это и есть данные.

Вот *.xaml.cs окна из моего примера. Тут только по свойству VM переключает надписи и всё. Всё остальное в VM+Model, Model у меня это СУБД MS SQL Server + слой доступа к данным на C#.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Threading;
using System.Windows;
 
using Services.Interfaces.WindowsVM;
 
namespace DBClient.Views.Windows
{
    /// <summary>
    /// Interaction logic for KSGONZListWindow.xaml
    /// </summary>
    public partial class KSGONZListWindow : Window
    {
        public KSGONZListWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            IKSGONZListWindowVM vm = (IKSGONZListWindowVM)DataContext;
 
            switch (vm.NZMode)
            {
                case true:
                    Title = "Просмотр списка НЗ";
                    txtCaption.Text = "Просмотр списка НЗ";
                    txtDate.Text = "Дата задания";
                    break;
 
                case false:
                    Title = "Просмотр списка ОНЗ";
                    txtCaption.Text = "Просмотр списка ОНЗ";
                    txtDate.Text = "Дата отчёта";
                    break;
            }
 
            vm.ViewContext = SynchronizationContext.Current;
        }
    }
}
У вас кстати классическая компоновка вырисовывается:
1. View - ваше окно, показывает пользователю что нужно и принимает от него действия, которые по привязанным командам/свойствам передаются в VM.
2. Model - ваша СУБД + Excel + методы доступа к ним для получения/записи данных.
3. ViewModel - соединяет 1 и 2 своими методами и свойствами. Получает данные из Model, присваивает их своим свойствам ( по привязкам View меняет данные в своих свойствах), готовит их для/из Model и передаёт их в/из Model с помощью методов из Model. Вот и все дела...
4. А ещё не всё Чтобы всё это запустилось, нужно в Application запустить DI (Dependency Injection) где все слои настраивают своё взаимодействие...

WPF изначально был разработан для MVVM и поддерживает этот паттерн из коробки. Всё остальное - это просто головная боль.

Хотите что-то быстро налепить - возьмите Windows Forms (другой тип проекта в студии). Там с этим делом проще. Хотя тоже не приветствуется, для Windows Forms есть свой паттерн - называется MVP.
1
Заблокирован
15.07.2026, 11:47
Цитата Сообщение от Vgal Посмотреть сообщение
Так что я явно понимая суть MVVM на практике работаю в более удобном для меня, а не для всех, режиме.
Это именно этот случай.
Изображения
 
0
0 / 0 / 0
Регистрация: 11.07.2026
Сообщений: 12
15.07.2026, 13:20  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
...между очисткой коллекции и сбросом SelectedItem=null и SelectedIndex=-1 должно пройти время.
Я смотрю в отладчике. В нем тоже «20-50мс» играют роль?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поэтому и говорят что в UI элементах нельзя хранить данные.
Раньше было, например так:
C#
1
2
3
4
5
6
...
            lbDoc.ItemsSource =
               DocFilter == DocFilters.Все
                  ? cls.regs.ToList()
                 : cls.regs.Where(x => x.IsNoLinked).ToList();
...
В ItemsSource загружается копия данных, а не сами данные. В начале отсутствовали «.ToList()»
Теперь, когда по Вашему предложению сделал «ItemsSource="{Binding REGS}"», стало
C#
1
2
3
4
5
6
7
8
9
      public ObservableCollection<ClsReg> REGS {
         get { return (ObservableCollection<ClsReg>) GetValue(REGSProperty); }
         set { SetValue(REGSProperty, value); }
      }
 
      // Using a DependencyProperty as the backing store for REGS.  This enables animation, styling, binding, etc...
      public static readonly DependencyProperty REGSProperty =
         DependencyProperty.Register("REGS", typeof(ObservableCollection<ClsReg>), typeof(ClsLink),
            new PropertyMetadata(new ObservableCollection<ClsReg>()));
C#
1
2
3
4
5
6
7
8
9
...
           REGS.Clear();
            var sd = DocFilter == DocFilters.Все
                  ? cls.regs.ToList()
                  : cls.regs.Where(x => x.IsNoLinked).ToList();
            foreach(var s in sd) {
               REGS.Add(s);
            }
...
Как я понимаю, в элементах не хранятся данные. Может я не прав?

Добавлено через 8 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
нужно в Application запустить DI (Dependency Injection) где все слои настраивают своё взаимодействие
Становится ещё страшнее.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Хотите что-то быстро налепить - возьмите Windows Forms (другой тип проекта в студии). Там с этим делом проще.
Не знаю как для Вас, для меня Windows Forms сразу устарела после появления WPF.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
15.07.2026, 13:49
Цитата Сообщение от Vgal Посмотреть сообщение
Не знаю как для Вас, для меня Windows Forms сразу устарела после появления WPF.
Ну тогда сразу нужно учиться работать с WPF правильно, чтобы не было мучительно больно за бесцельно потраченное время.

Добавлено через 18 минут
Цитата Сообщение от Vgal Посмотреть сообщение
Становится ещё страшнее.
Если по честному, то ничего там сложно нет - пять строчек кода и одна зависимость из NuGet
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.07.2026, 19:57
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
WPF изначально был разработан для MVVM и поддерживает этот паттерн из коробки.
Чуть наоборот. Сначала появился WPF (Avalon), а потом пришло понимание, что MVC/MVP неоптимальны для него. Тогда один из главных архитекторов WPF решил разработать паттерн специально под возможности новой платформы.

Также командой Microsoft был разработан первый официальный WPF-фреймворк — Composite Application Guidance for WPF (Prism). Но он оказался чрезмерно сложным и не получил широкого распространения в любительской среде. Его основной нишей стали «тяжёлые» корпоративные приложения.

Добавлено через 20 минут
Цитата Сообщение от Vgal Посмотреть сообщение
Я смотрю в отладчике. В нем тоже «20-50мс» играют роль?
Если изменения происходят в одном фрейме с рендерингом, то это не позволяет зависимым свойствам принять новые значения.

Они его примут после выхода из этого фрейма.
Хоть отладчиком, хоть чем смотри.
Иначе и невозможно было бы использовать отладчик для отладки асинхронных приложений.

Цитата Сообщение от Vgal Посмотреть сообщение
Теперь, когда по Вашему предложению сделал «ItemsSource="{Binding REGS}"», стало
Это лучше.
Но в данном случае избыточно.

В большинстве случаев (99%) хватает такой реализации:
C#
1
public ObservableCollection<ClsReg> REGS {get;} = [];
В очень редких случаях, когда требуется смена колекции, то
C#
1
2
private ObservableCollection<ClsReg> _regs;
public ObservableCollection<ClsReg>? REGS {get =>_regs; set => Set(value);} = [];
Где Set(value) - метод фреймворка отвечающий за реализацию INPC.

Обычно если требуется менять коллекцию, то не требуется изменять её элементы и наоборот.
Поэтому в ObservableCollection обычно используется в иммутабельном свойстве, а в мутабельном используется какой-то IList<T>.

Использование же DependencyProperty на уровне ViewModel и ниже - вообще, недопустимо (не только по MVVM, но и более широко по SOLID).
0
0 / 0 / 0
Регистрация: 11.07.2026
Сообщений: 12
16.07.2026, 12:43  [ТС]
Добавлено через 8 минут
Вот опять проблемы со мной. Написал о решении проблемы, и поблагодарил за все, нажал на кнопку [Отправить быстрый ответ] и получил пустой «ответ».

Добавлено через 4 минуты
Короче сделал чтобы в ListBox хранились только готовые строки, без ItemTemplate и DataTemplate.
Спасибо за внимание и советы.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 12:45
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вот их отображение (View)
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
XML
1
Loaded="Window_Loaded"
Ай-я-яй!
Нечистое это!

А где же Interaction / Behaviours ?

XML
1
2
3
4
5
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding WindowLoadedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
16.07.2026, 12:56
wizard41, Всё там нормально При загрузке получаем контекст окна
C#
1
vm.ViewContext = SynchronizationContext.Current;
Как его по другому выцепить?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 13:05
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
При загрузке получаем контекст окна
Его лучше получать в App, тогда уж..

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Как его по другому выцепить?
В Модели, вызвав команду из VM.

Я это к тому, что вроде как "топим" (призываем) за чистый mvvm, а показываем примеры слегка "грязноватые"...
*.xaml.cs должен быть пустым (кроме InitializeComponent()).

Добавлено через 4 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Title = "Просмотр списка НЗ";
txtCaption.Text = "Просмотр списка НЗ";
txtDate.Text = "Дата задания";
Это что такое!? Ууууу...!
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
16.07.2026, 13:48
Цитата Сообщение от wizard41 Посмотреть сообщение
Я это к тому, что вроде как "топим" (призываем) за чистый mvvm, а показываем примеры слегка "грязноватые"...
MVVM не запрещает код в CodeBehind У ТС вся логика в *.xaml.cs, вот и пошёл разговор про разделение и привязки.
Цитата Сообщение от wizard41 Посмотреть сообщение
Это что такое!? Ууууу...!
А что мне для такой пустяковины лабать свойства и логику в VM? Тут две строчки, а там... Так что всё нормуль, это логика View и находится она во View
Цитата Сообщение от wizard41 Посмотреть сообщение
В Модели, вызвав команду из VM.
А вы уверены что получите контекст именно этого окна, а не чего-то другого?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 13:57
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А что мне для такой пустяковины лабать свойства и логику в VM?
Да, если соблюдаем mvvm от и до.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Тут две строчки, а там...
5-6.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Так что всё нормуль, это логика View и находится она во View
Окей. У меня есть модель, но нет вашего View. Соотв. нет никаких txtCaption, txtDate. Чтобы вывести в них данные, придется создавать свой "огород" - т.е. будем иметь расхождение с версией автора модели. Приложение сразу становится неуниверсальным и зависит от того, кто там налепил "отсебятины" какой..
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вы уверены что получите контекст именно этого окна, а не чего-то другого?
Конечно уверен, если я сам это окно показываю, передавая в него необходимый контекст.
0
HF
16.07.2026, 14:00

Не по теме:

Тот случай, когда проще (да и уже так написано судя по коду) написать на WinForms, но тренды "заставляют колоться" об WPF.

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
16.07.2026, 14:03
Цитата Сообщение от wizard41 Посмотреть сообщение
Конечно уверен, если я сам это окно показываю, передавая в него необходимый контекст.
Не в него, а из него. И контекст можно получить только после полной загрузки и визуализации окна, что и происходит в методе Window_Loaded().
Цитата Сообщение от wizard41 Посмотреть сообщение
Окей. У меня есть модель, но нет вашего View.
У VM есть свойство, оно в switch и используется, которое работает как флаг режима работы, а вы уже в своём View делаете что хотите в зависимости от значения этого свойства.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 14:07
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Не в него, а из него.
Ну, я конечно, не знаю деталей... Просто намекаю, мол, что юзать в CB элементы View по именам - такое себе.
И окно вроде бы как Child (?), соответственно, установить/получить его контекст можно еще ДО его появления в принципе.
Ладно, это я так. Поворчать нельзя что ли
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
16.07.2026, 14:19
Цитата Сообщение от wizard41 Посмотреть сообщение
И окно вроде бы как Child (?)
Нет, окна не имеют хозяев.
Цитата Сообщение от wizard41 Посмотреть сообщение
Ладно, это я так. Поворчать нельзя что ли


Добавлено через 6 минут
Цитата Сообщение от wizard41 Посмотреть сообщение
Просто намекаю, мол, что юзать в CB элементы View по именам - такое себе.
Дык этож один и тот же класс, имена это его поля
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 14:26
Просто фраза:
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
контекст можно получить только после полной загрузки и визуализации окна
для меня звучит несколько странно. Как и почему контекст стал зависеть от отрисовки окон?
На сколько я понял, содержимое окна зависит от флага vm.NZMode - верно? Стало быть, этот флаг известен уже на стадии создания VM (vm). Теперь, все зависящие элементы должны отработать по привязке к этому NZMode..

Если это окно "главное", т.е. показывается сразу после запуска приложения, то и создание VM, чтение чего-то там (БД) и последующий показ окна с установкой DataContext - вообще выносится на уровень приложения (в App).

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
этож один и тот же класс, имена это его поля
Мммм.. Не совсем, в данном случае.
Это создает сильную связь с таким (оригинальным) View. Если у меня View другой, то с этим возникнет проблема.

Все. Ликбез закончен - пошли пить пиво
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,706
Записей в блоге: 4
16.07.2026, 14:53
Цитата Сообщение от wizard41 Посмотреть сообщение
Как и почему контекст стал зависеть от отрисовки окон?
Вот где используется этот контекст в VM, работа метода в другом потоке
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
28
29
30
31
32
33
34
35
// Метод VM
private async Task LoadONZListAsync()
{
    List<ONZList> list = new List<ONZList>();
 
    try
    {        
        switch (NZMode)
        {
            case true:
                foreach (ONZList item in await _mainDA.KSGONZDataDA.GetNZListAsync(SelectedDate, EObject, Branch, FullRange))
                    list.Add(item);
                break;
 
            case false:
                foreach (ONZList item in await _mainDA.KSGONZDataDA.GetONZListAsync(SelectedDate, EObject, Branch, FullRange))
                    list.Add(item);
                break;
        }
        // Вот контекст окна где используется
        // Для синхронизации привязанных коллекций из другого потока
        ViewContext.Send(_ =>
        {
            if (List.Count > 0) // А это привязанная коллекция к элементу UI
                List.Clear();
 
            if (list.Count > 0)
                list.ForEach(l => List.Add(l));
        }, null);
    }
    catch (Exception ex)
    {
        _windowService.ShowErrorMessage(ex.Message, "Ошибка");
    }
}
Цитата Сообщение от wizard41 Посмотреть сообщение
с установкой DataContext
Это не DataContext, это контекст исполнения кода, в данном случае контекст (поток) выполнения кода самого окна.
Цитата Сообщение от wizard41 Посмотреть сообщение
Это создает сильную связь с таким (оригинальным) View. Если у меня View другой, то с этим возникнет проблема.
В WPF файлы *.xaml и *.xaml.cs - это файлы одного и того же разделённого (partial) класса, так что все именованные элементы UI являются приватными полями класса окна. Ну как так, эххх
Цитата Сообщение от wizard41 Посмотреть сообщение
пошли пить пиво
Пошли, в горле пересохло
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 15:28
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Ну как так, эххх
А "эххх" тут вот в чем:
Намерение использовать событие Loaded может трактоваться как желание предварительно "подготовить" данные для этого окна. Т.е., это означает, что когда окно отрисуется - в нем будут показаны текущие валидные данные + состояние элементов окна соотв. некоторым там флагам.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
В WPF файлы *.xaml и *.xaml.cs - это файлы одного и того же разделённого (partial) класса
Это понятно. Однако, учитывая именно модель MVVM - происходит "разрыв" в понимании контекста. В CB окна (View) присутствуют явные (жесткие) инструкции, типа txtCaption.Text = "Просмотр списка НЗ";. Про строку "Просмотр списка НЗ" не знает никто, кроме самого View.
Если к VM подключить совершенно другую View, написанную другими, то здесь произойдет неясная ситуация: что писать, если свойство vm.NZMode == true? Будут звонить в 3 ночи и спрашивать "А что это означает?".
Таким образом, паттерн не соблюден полностью - есть сильная связь с объектами внутри класса окна (View), которые, частично, диктуют содержание итогового окна. Нет этой View - нет этого содержания.

Опять же, не вдаваясь в детали конкретно этого приложения, я бы поступил по другому: сперва получил бы весь контекст (включая тот же флаг NZMode), даже через await, если это долго. И только потом показал бы окно. И все это в стартовой фазе класса App. Никакие события вроде "Window_Loaded" для этого даже не потребовались бы.

Для чего это может быть нужно - только, если, к примеру, в зависимости от каких-то данных, в окне рассчитываются какие-то размеры или позиции.. Но это редкость, особенно для WPF.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2026, 15:28

Работа с SelectedItems ListBox
Здравствуйте, делаю приложение на WPF, решил попробовать делать его по паттерну MVVM. Появилась...

Datagrid получить SelectedItems mvvm
С привязкой SelectedItem все понятно &lt;DataGrid SelectedItem=&quot;{Binding GridSelectedItem}&quot;&gt; ...

Один скролл для всех вкладок - при смене вкладок в TabControl положение скролла остается на прежнем месте
Добрый вечер) Почему при смене вкладок в TabControl положение скрола остается на прежнем месте,...

listbox SelectionChanged clear
привествую. Вопрос есть допустим список из 10 элементов в listbox. я нажимаю на один из них он...

ошибка в TreeView.Items.Clear();
В общем обработчик нажатия кнопки должен добавить в ListSpec один объект, а потом обновить дерево,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru