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

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

11.07.2026, 15:51. Показов 3481. Ответов 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
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
16.07.2026, 16:21
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от wizard41 Посмотреть сообщение
Никакие события вроде "Window_Loaded" для этого даже не потребовались бы.
Почитайте что такое SynchronizationContext и попробуйте его определить без полной загрузки окна, когда ОС не знает что это такое и какие ресурсы этому выделить. Основное окно работает в своём потоке, а все остальные окна не факт что будут в потоке основного окна.
Цитата Сообщение от wizard41 Посмотреть сообщение
Если к VM подключить совершенно другую View, написанную другими, то здесь произойдет неясная ситуация: что писать, если свойство vm.NZMode == true?
Они сами напишут что им нужно, для NZMode есть документация в интерфейсе, там всё рассказывается что это и за что отвечает.
Цитата Сообщение от wizard41 Посмотреть сообщение
Про строку "Просмотр списка НЗ" не знает никто, кроме самого View.
А никто и не должен знать про это, это забота View написать и показать пользователю, а что он будет показывать - это уже придумают те, кто будет писать View для этой VM.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 17:01
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
что такое SynchronizationContext
Да знаю я что это такое. Но в данном случае не могу соотнести это с выполняемой задачей приложения. То, как сделано у тебя - я спокойно сделаю "правильно" .

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
это забота View написать и показать пользователю
Конечно, если эту View делаешь ты сам и полностью понимаешь предметную область программы. Однако, если все же действительно соответствовать максимальной абстракции слоев, то любая жесткая логика во View (CB) неприемлема.
На худой конец, там можно описать AP/DP свойства, которые, в свою очередь, все-таки получат данные от той же VM.

Почему я так говорю - потому что зачастую, в реальной разработке, View "рисуют" люди, весьма далекие от понимания предмета (дизайнеры). Они никогда не смогут прописать в CB tb.Text = "Что-то там"; просто потому, что не понимают о чем речь. А поэтому, в эти места и в нужное время данные должна сообщить именно VM. И те данные, которые "задумал" разработчик, т.к. он, как говориться, "в теме".

Правильный MVVM тот, в котором без оригинального View я смогу нарисовать свой, и где все отобразится правильно, на основании заложенной логики именно в модели/вью-модели. Т.е. я не должен думать "что там имел в виду автор вот тут-то и тут-то". Любое созданное View сторонним человеком должно отобразить реальное положение дел без всяких вниканий в область предмета программы.

В ряде проектов в некоторых компашках, где я участвовал, юзание CB окон вообще запрещено. Любое вмешательство туда - сразу привязывает что-то к этому конкретному View, а значит, начинает "проникать" сквозь остальные слои.

Я сторонник такого высказывания: "Надо делать сразу правильно. Плохо - само получится."
Andrey-MSK, ладно, просто высказал свое мнение. Это не руководство к действию что-то срочно менять. Опыт, как говорится, сын ошибок трудных. Вот только с этой позиции и поясняю. А так то - кто как хочет - так и ...

Добавлено через 1 минуту
P.S.
Это я еще про DI песню не запел... Тут тоже бы разнес бы идею в пух и прах (в задаче ТС)..
2
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
16.07.2026, 17:29
Цитата Сообщение от wizard41 Посмотреть сообщение
Это я еще про DI песню не запел...
Таааак... А что в DI не так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static ServiceProvider ConfigureServices()
{
    ServiceCollection services = new ServiceCollection();
 
    services
        .AddSingleton(Current.Configuration)
        .AddSingleton<IMainDA, MainDA>()
        .AddSingleton<IViewModelsService, ViewModelsService>()
        .AddSingleton<IWindowService, WindowService>()
        .AddSingleton<IBackgroundTaskQueue, BackgroundTaskQueue>()
        .AddSingleton<IViewModelFactory, ViewModelFactory>()
        .AddSingleton<IMainWindowVM, MainWindowVM>();
        // все остальные VM и сервисы...
}
C#
1
2
3
4
5
6
7
8
9
10
public KSGWorkEditDialogVM(IWindowService windowService,
                           IBackgroundTaskQueue taskQueue,
                           IMainDA mainDA,
                           IViewModelFactory viewModelFactory)
{
    _windowService = windowService;
    _taskQueue = taskQueue;
    _mainDA = mainDA;
    _viewModelFactory = viewModelFactory;
}
Вот и вся DI

Добавлено через 14 минут
wizard41, Я тут более интересную игрушку нашел
Кликните здесь для просмотра всего текста

Java
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package net.mycompany.webapi.controllers;
 
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import net.mycompany.webapi.dto.DrawReportDto;
import net.mycompany.webapi.interfaces.repositories.ReportsRepository;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.List;
 
/**
 * REST-контроллер для управления отчётами по работам.
 */
@RestController
@Validated
@RequestMapping("api/reports")
@Tag(name = "Отчёты по выполнению работ", description = "CRUD-операции для управления отчётами")
public class ReportsController {
 
    private final ReportsRepository repository;
 
    public ReportsController(ReportsRepository repository) {
        this.repository = repository;
    }
 
    /**
     * Возвращает список чертежей с объёмами работ.
     *
     * @param branchId   ID филиала
     * @param gpObjectId ID объекта генерального плана
     * @param groupId    ID группы трудозатрат
     * @return список объектов типа {@link DrawReportDto}; никогда не возвращает {@code null}
     */
    @Operation(
            summary = "Получить отчёт по чертежам с объёмами работ",
            description = "Возвращает список чертежей с объёмами работ"
    )
    @ApiResponse(responseCode = "200", description = "Список объектов получен")
    @GetMapping("full_draw_report")
    public List<DrawReportDto> getFullDrawReport(
            @Parameter(description = "ID филиала", required = true)
            @RequestParam
            @NotNull
            @Positive
            Integer branchId,
            @Parameter(description = "ID объекта генерального плана", required = true)
            @RequestParam
            @NotNull
            @Positive
            Integer gpObjectId,
            @Parameter(description = "ID группы трудозатрат", required = true)
            @RequestParam
            @NotNull
            @Positive
            Integer groupId
    ) {
        return repository.getDrawReport(branchId, gpObjectId, groupId);
    }
}
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
16.07.2026, 18:48
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А что в DI не так?
DI имеет смысл, когда есть куча сервисов, которые нужно вызывать непонятно когда и где. Если приложение работает только с конкретными сервисами и в принципе заточено под них - DI бесполезная куча кода.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
интересную игрушку нашел
Ну так то да, Swagger и Spring в Java знают свое дело. Мощные штуковины, особенно если знать как их "готовить".
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
16.07.2026, 20:08
Цитата Сообщение от wizard41 Посмотреть сообщение
DI имеет смысл, когда есть куча сервисов, которые нужно вызывать непонятно когда и где. Если приложение работает только с конкретными сервисами и в принципе заточено под них - DI бесполезная куча кода.
Прям, пипец, как согласен!
Суют этот DI куда не попадя, даже не задумываются для чего он нужен.
1
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
17.07.2026, 08:45
Цитата Сообщение от wizard41 Посмотреть сообщение
DI бесполезная куча кода
Ну не такая уж и большая эта куча. Один using, один метод в Application, приватные поля в классе и их материализация в конструкторе. Зато, если вдруг захочется расширять, у тебя у же всё готово, бери и подключай что нужно из новопридуманного. Ну и DI приучает к использованию интерфейсов, что само по себе хороший плюс

Сейчас начал ковыряться с Java, решил перенести всё что есть в C# туда, сделать WebAPI + клиента. И если для Spring DI уже встроен, то для клиента пришлось искать варианты, в итоге нашел. ХЗ актуально или нет, но работает
Кликните здесь для просмотра всего текста

Java
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package net.mycompany.di;
 
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import net.mycompany.controllers.MainWindowControllerImpl;
import net.mycompany.interfaces.controllers.MainWindowController;
import net.mycompany.interfaces.repositories.DrawReportRepository;
import net.mycompany.interfaces.repositories.GeneralPlanObjectRepository;
import net.mycompany.interfaces.repositories.LaborGroupRepository;
import net.mycompany.interfaces.repositories.ObjectRepository;
import net.mycompany.interfaces.services.ConfigService;
import net.mycompany.interfaces.services.DialogService;
import net.mycompany.interfaces.services.ExceptionHandler;
import net.mycompany.interfaces.services.VersionService;
import net.mycompany.models.repositories.DrawReportRepositoryImpl;
import net.mycompany.models.repositories.GeneralPlanObjectRepositoryImpl;
import net.mycompany.models.repositories.LaborGroupRepositoryImpl;
import net.mycompany.models.repositories.ObjectRepositoryImpl;
import net.mycompany.services.ConfigServiceImpl;
import net.mycompany.services.DialogServiceImpl;
import net.mycompany.services.ExceptionHandlerImpl;
import net.mycompany.services.VersionServiceImpl;
import net.mycompany.views.MainWindow;
import org.jetbrains.annotations.Contract;
import org.jspecify.annotations.NonNull;
 
/**
 * Конфигурация зависимостей для Guice.
 */
public final class AppModule extends AbstractModule {
 
    @Override
    protected void configure() {
        // Сервисы
        bind(DialogService.class).to(DialogServiceImpl.class).asEagerSingleton();
        bind(ConfigService.class).to(ConfigServiceImpl.class).asEagerSingleton();
        bind(ExceptionHandler.class).to(ExceptionHandlerImpl.class).asEagerSingleton();
        bind(ObjectRepository.class).to(ObjectRepositoryImpl.class).asEagerSingleton();
        bind(GeneralPlanObjectRepository.class).to(GeneralPlanObjectRepositoryImpl.class).asEagerSingleton();
        bind(LaborGroupRepository.class).to(LaborGroupRepositoryImpl.class).asEagerSingleton();
        bind(DrawReportRepository.class).to(DrawReportRepositoryImpl.class).asEagerSingleton();
        bind(VersionService.class).to(VersionServiceImpl.class).asEagerSingleton();
 
        // Контроллеры
        bind(MainWindowController.class).to(MainWindowControllerImpl.class);
    }
 
    /**
     * Предоставляет экземпляр {@link MainWindow} как singleton.
     * <p>
     * Создаётся один раз, при первом запросе.
     * </p>
     *
     * @return экземпляр {@link MainWindow}
     */
    @Contract(" -> new")
    @Provides
    @Singleton
    public @NonNull MainWindow provideMainWindow() {
        return new MainWindow();
    }
}
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
18.07.2026, 07:20
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Сейчас начал ковыряться с Java, решил перенести всё что есть в C# туда, сделать WebAPI + клиента.

Не по теме:


Зачем ковыряться с Java, если есть C#, какой смысл лезть в аналогичный но менее современный B2B аналог языка с GC?
С таким же огромным пластом API.
Лучше бы на Rust глянули.

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.07.2026, 08:40
Цитата Сообщение от IamRain Посмотреть сообщение
Зачем ковыряться с Java, если есть C#

Не по теме:

Захотелось


0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
20.07.2026, 15:22
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Захотелось

Не по теме:

Изменник! :-)

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
20.07.2026, 15:25
Цитата Сообщение от wizard41 Посмотреть сообщение
Изменник! :-)

Не по теме:

А у самого значок с кружкой над аватаркой


0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
14.08.2026, 21:04
Цитата Сообщение от wizard41 Посмотреть сообщение
То, как сделано у тебя - я спокойно сделаю "правильно"
Имеешь ввиду вот так?
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
public class ViewContextBehavior : Behavior<Window>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += OnLoaded;
    }
 
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        // Получаем контекст синхронизации
        var context = SynchronizationContext.Current 
                      ?? new SynchronizationContext();
 
        // Если DataContext реализует интерфейс — передаём контекст
        if (AssociatedObject.DataContext is IViewContextAware vm)
        {
            vm.SetViewContext(context);
        }
 
        AssociatedObject.Loaded -= OnLoaded;
    }
 
    protected override void OnDetaching()
    {
        AssociatedObject.Loaded -= OnLoaded;
        base.OnDetaching();
    }
}


Добавлено через 3 минуты
То бишь будем на каждый чих писать Behavior? Ну да, MVVM + WPF + Behavior == чистый CodeBehind
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
15.08.2026, 11:33
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Имеешь ввиду вот так?
Нет.
Я про пакет Microsoft.Windows.Interactivity и Behavior в разметке XAML у элементов. Они биндяться, например к Command.
Никакого CB не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2026, 11:33

Работа с 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 один объект, а потом обновить дерево,...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
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 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru