0 / 0 / 0
Регистрация: 29.04.2024
Сообщений: 10

Взаимодействие UserControl, ContentControl и SelectedItem в Listbox

30.04.2024, 11:59. Показов 9094. Ответов 77

Студворк — интернет-сервис помощи студентам
Доброго утра!
Каждый элемент Listbox содержит путь к картинке, которая должна показываться в ContentControl с помощью свойства SelectedItem:
C#
1
2
3
4
5
6
private AgencyModel _selectedAgency;
public AgencyModel SelectedAgency
{
    get { return _selectedAgency; }
    set { Set(ref _selectedAgency, value); }
}
Окно MainWindow.xaml и UserControl HomeView используют одну ViewModel MainViewModel (реализует INotifyPropertyChanged).
В Listbox используется Expander.

Проблема в том, что SelectedItem ListBox никак не хочет коннектиться с HomeView, в котором отображается картинка. Хотя другие публичные свойства (не из ListBox) нормально биндятся в HomeView и отображаются в contentControl MainWindow.xaml.

Listbox размещен в MainWindow.xaml:

XML
1
2
3
4
5
6
7
<ListBox x:Name="list1" Grid.Column="0" Style="{x:Null}" BorderThickness="0"
         ItemsSource="{Binding Source={StaticResource ListBoxItems}, UpdateSourceTrigger=PropertyChanged}"
         SelectedItem="{Binding SelectedAgency, UpdateSourceTrigger=PropertyChanged}"                         
         ScrollViewer.HorizontalScrollBarVisibility="Hidden" Background="Transparent">
         <!--Здесь есть еще код для группировки, DataTemplate, стиль отображения-->
    
</ListBox>
ContentControl находится в MainWindow.xaml рядом с ListBox
XML
1
2
3
<ContentControl Grid.Column="1"
                 Margin="5"
                 Content="{Binding CurrentView, UpdateSourceTrigger=PropertyChanged}"/>
App.xaml:
XML
1
2
3
4
5
6
7
8
<Application.Resources>
        <ResourceDictionary>                   
            <DataTemplate DataType="{x:Type viewModel:HomeViewModel}">
                <view:HomeView/>
            </DataTemplate>
        </ResourceDictionary>
    </Application.Resources>
</Application>
HomeView.xaml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<UserControl x:Class="WpfApp1.View.HomeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp1.View"
             xmlns:MainVM="clr-namespace:WpfApp1.ViewModel"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="700"
             >
    <UserControl.DataContext>
        <MainVM:MainViewModel/>
    </UserControl.DataContext>
 
    <Grid Margin="0,0,0,0">
        <TextBlock Text="{Binding SettingM.MapFile}" Foreground="White"/>
        <Image Source="{Binding SelectedAgency.MapFile, UpdateSourceTrigger=PropertyChanged}" 
               Opacity="0.2" Stretch="Uniform"
               />
    </Grid>
</UserControl>
P.s. ListBox корректно взаимодействует с MainViewModel и свойством SelectedAgency.
Я так понимаю, что SelectedItem надо как то иначе обрабатывать, вопрос как это делать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2024, 11:59
Ответы с готовыми решениями:

При выборе Item в одном ListBox'е, SelectedItem в другом ListBox, стал недоступен
А ещё скажите пожалуйста, как сделать, чтобы когда я выбирал Item в одном ListBox'е, Item в другом листбоксе, если до этого он был выбран,...

ListBox SelectedItem
Добрый день. Помогите пожалуйста с проблемкой : Есть: &lt;ListBox ItemsSource=&quot;{Binding Videos}&quot; SelectedItem=&quot;{Binding...

Убрать SelectedItem в ListBox
Добрый. Скажите пожалуйста, как убрать выделение item'a, после нажатие на него (см. вложение). Для чего мне это надо? - Дело в том, что...

77
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
15.05.2024, 10:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xellan24rus Посмотреть сообщение
То другое окно не знает о том в котором привязана эта Vm, так как объект задан в другом месте(новый - неизвестный)
Вот сваял, понадобилось мне определять открытое окно с нужной VM и взаимодействовать с VM этого окна из другой VM другого окна которая вообще не в курсе есть она или нет. Всё работает через DI. В WindowService, который я показывал выше, добавить вот эти два метода, в класс и интерфейс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Находим нужное открытое окно по его VM
public bool CheckOpenedWindow(IBaseViewModel viewModel)
{
    WindowCollection windows = Application.Current.Windows;
    Window window = windows
        .OfType<Window>()
        .FirstOrDefault(w => w.DataContext?.GetType() == viewModel.GetType());
 
    return window != null;
}
 
// Получаем VM окна, которое нашли методом выше
public T GetOpenedWindowViewModel<T>() where T : IBaseViewModel
{
    T viewModel = _viewModelFactory.CreateViewModel<T>();
 
    WindowCollection windows = Application.Current.Windows;
    Window window = windows
        .OfType<Window>()
        .FirstOrDefault(w => w.DataContext?.GetType() == viewModel.GetType());
 
    return (T)window.DataContext;
}
Методы работают в связке. Вот пример из тестовой команды VM
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Метод команды Executed
private void TransferLaborExecuted(object obj)
{
    // Если нужное нам окно открыто
    if (_windowService.CheckOpenedWindow(_workDataDialogVM))
    {
        // Получаем его VM
        IWorkDrawDataSetDialogVM vm = _windowService.GetOpenedWindowViewModel<IWorkDrawDataSetDialogVM>();
 
        // И что-то с этим всем делаем, у меня для теста вывод публичных свойств
        // которые заполнены в этом экземпляре
        _windowService.ShowInfoMessage(string.Format("{0} {1}", vm.Branch.GetBranchName(), vm.EObject.EObjectName), "Info");
    }
    else
        _windowService.ShowInfoMessage("Окно не найдено", "Info");
}
Если конечно я правильно понял вашу фразу

Добавлено через 2 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C#
1
T viewModel = _viewModelFactory.CreateViewModel<T>();
Тут получаем объект чистой VM из сервиса для определения её типа.

Добавлено через 4 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Тут получаем объект чистой VM из сервиса для определения её типа.
Можно без лишнего объекта
C#
1
2
3
4
5
6
7
8
9
public T GetOpenedWindowViewModel<T>() where T : IBaseViewModel
{
    WindowCollection windows = Application.Current.Windows;
    Window window = windows
        .OfType<Window>()
        .FirstOrDefault(w => w.DataContext?.GetType() == _viewModelFactory.CreateViewModel<T>().GetType());
 
    return (T)window.DataContext;
}
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.05.2024, 10:35
Цитата Сообщение от employee19 Посмотреть сообщение
public List<AgencyModel> AllAgencys
Не рекомендую в свойствах VM мутабельные ненаблюдаемые коллекции.
Лучше public IEnumerable<AgencyModel> AllAgencys или public ObservableCollection<AgencyModel> AllAgencys.
Так же не стоит делать публичным сеттер свойства, если нет НЕОБХОДИМОСТИ изменять свойство из ViewModel.

Добавлено через 2 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Находим нужное открытое окно по его VM
На первый взгляд - Жуть какая-то....
Может не совсем врубаюсь для какой задачи такое, вообще, может понадобиться.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
15.05.2024, 10:39
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может не совсем врубаюсь для какой задачи такое, вообще, может понадобиться.
Мне нужно по команде из одного окна, которое не диалог, заполнить нужные данные в другом окне, при этом первое окно должно остаться на экране, потому и не диалог. Придумал вот такой вариант...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.05.2024, 10:50
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Придумал вот такой вариант...
Ну, выглядит как дикий костыль.
"Данные"- это функция VM. Окна как бы не причём должны быть.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
15.05.2024, 10:52
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"Данные"- это функция VM. Окна как бы не причём должны быть.
Дак я и работаю с VM, просто получаю экземпляр который в настоящее время используется в открытом окне.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.05.2024, 11:24
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
просто получаю экземпляр который в настоящее время используется в открытом окне.
У вас несколько экземпляров VM?
Тогда не понятно почему нужен первый.
А если один, то почему не используете локатор, например.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
15.05.2024, 11:34
Элд Хасп, У меня все VM запущены через DI с модификатором Transient.
C#
1
.AddTransient<IWorkDrawDataSetDialogVM, WorkDrawDataSetDialogVM>()
Поэтому при каждом открытии окна создаётся свой экземпляр VM именно для этого окна.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тогда не понятно почему нужен первый.
Потому что для этой цели открывается всего одно такое окно. Тут конечно можно еще покумекать, если окон будет, для другого случая, больше... Но пока еще такая необходимость не возникала
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.05.2024, 12:22
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
У меня все VM запущены через DI с модификатором Transient.
Один из моментов за что я их не люблю.
Размазывание функционала между слоями, хотя декларируется, то они создаются наоборот для лучшей изоляции.

Я точно могу сказать, что ваше решение это костыль. Возможно он вынужденный и по другому с DI нельзя, но это уже другой вопрос.

Если экземпляр VM гарантированно единственный в один момент времени, то я бы его прокидывал из окна в локатор и другим окном получал оттуда.
Тоже костыль, но уже не настолько кривой.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
15.05.2024, 20:39
employee19, пример по вопросу.
Единственное отличие у окна другого то что задал источники данных.
XML
1
ItemsSource="{Binding Path=(local:MainVM.Instance).DataCollection}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedData, Source={x:Static local:MainVM.Instance}}"
В данном случае Path или Sourse на выходе дают одно и тоже.
DataGridDELETE.rar


По поводу того что на скриншоте я уже ранее писал.
AllAgencys у вас коллекция. Вы хотите использовать так
XML
1
Text="{Binding Path=(vm:MainViewModel.Instance).AllAgencys.ShortName}"
Разве это не ошибка?
Это сравнимо с этим.
C#
1
string temp = MainViewModel.Instance.AllAgencys.ShortName;
Здесь вы сразу получите ошибку о том ShortName не существует или в этом духе.
У вас есть свойство SelectedItem к примеру который по нужному порядку выводит данные, вот с этим свойством и работайте. В архиве найдете ответы.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
15.05.2024, 21:13
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Экземпляр, насколько понял, MainViewModel.Instance:
Я примерно так и представлял. Но ошибка совершенно в другом месте.
XML
1
Text="{Binding Path=(vm:MainViewModel.Instance).AllAgencys.ShortName}"
и т.п

Добавлено через 29 минут
Andrey-MSK, суть понял. Так можно найти то что я описывал в рамках вопроса

Не по теме:

Все же конечный выбор зависит от конечной задачи. Если это приложение, без нужды на использование внедрений зависимостей для проектов web, и других платформ. То написать навигатор можно в десяток раз короче в плане кода точно :) В целом я посмотрел на ваши примеры, что то на заметку взял :) Но тем не менее пока что не могу понять где это нужно.
Не большой пример. Есть Vm(ки) У них свои команды, для web api это уже не команды, а ActionResult к примеру. В данном случае интерфейс от vm для web api бесполезен.

Или же есть Vm и есть web приложение. У vm как и прежде есть команды, у web приложения view-controller и тут возращает результат к примеру тот же ActionResult и т.п. Тут если делать внедрение зависимостей, то интерфейс от vm тоже не подойдет.

Я вижу использование di примерно так.
wpf - xamarin(Если не ошибаюсь по написанию есть схожести)
web-api - web приложение.
В этим связках di может давать хорошую связку, написал только эти, но связок явно больше.
В остальных случаях локаторы-навигаторы дают более высокую скорость написания приложения.

1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
16.05.2024, 09:24
xellan24rus,
Эти вещи работают по другому. Взаимодействие с WEB идёт через запросы GET и POST из HTTP. То бишь вы всё равно будете делать три слоя приложения клиента, где доступ к WEB будет описан отдельными методами в отдельном сервисе, как доступы к БД.

DI для WEB и DI для клиента используются одинаково, технология ничем не отличается, только нюансами из-за встроенных возможностей ASP NET Core MVC.

Добавлено через 3 минуты
Цитата Сообщение от xellan24rus Посмотреть сообщение
Тут если делать внедрение зависимостей, то интерфейс от vm тоже не подойдет.
Конечно не подойдёт. Это ведь абсолютно разные вещи, мало того - абсолютно разные паттерны.

Добавлено через 40 минут
Цитата Сообщение от xellan24rus Посмотреть сообщение
В данном случае интерфейс от vm для web api бесполезен.
VM для WEB это просто набор свойств из разных классов модели в который контроллер пишет свои данные, а представление привязывает свой источник данных к этой VM. Вот пример
VM
C#
1
2
3
4
5
6
7
8
9
10
11
using System.Collections.Generic;
 
namespace SportsStore.Models.ViewModels
{
    public class ProductsListViewModel
    {
        public IEnumerable<Product> Products { get; set; }
        public PagingInfo PagingInfo { get; set; }
        public string CurrentCategory { get; set; }
    }
}
И View
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
@model ProductsListViewModel
 
@foreach (var p in Model.Products)
{
    <partial name="ProductSummary" model="p"/>
}
<div 
    page-model="@Model.PagingInfo" page-action="List"page-classes-enabled="true"
    page-class="btn" page-class-normal="btn-outline-secondary"
    page-class-selected="btn-primary" page-url-category="@Model.CurrentCategory"
    class="btn-group m-1">
</div>
И контроллер
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
using System.Linq;
 
using Microsoft.AspNetCore.Mvc;
 
using SportsStore.Models;
using SportsStore.Models.ViewModels;
 
namespace SportsStore.Controllers
{
    public class ProductController : Controller
    {
        private readonly IProductRepository _repository;
 
        public int PageSize = 4;
 
        public ProductController(IProductRepository repository)
            => _repository = repository;
 
        public ViewResult List(string category, int productPage = 1)
            => View(new ProductsListViewModel
            {
                Products = _repository.Products
                    .Where(p => category == null || p.Category == category)
                    .OrderBy(p => p.ProductID)
                    .Skip((productPage - 1) * PageSize)
                    .Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage = productPage,
                    ItemsPerPage = PageSize,
                    TotalItems = category == null ? _repository.Products.Count() : _repository.Products.Where(e => e.Category == category).Count()
                },
                CurrentCategory = category
            });
    }
}
Вот и смотрите разницу между MVVM и MVC...

Добавлено через 3 минуты
xellan24rus, А вот конфигурация DI в ASP NET Core MVC
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
builder.Services.AddControllersWithViews();
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration["ConnectionStrings:SportsStoreConnection"]);
});
builder.Services.AddDbContext<AppIdentityDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration["ConnectionStrings:IdentityConnection"]);
});
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
    .AddEntityFrameworkStores<AppIdentityDbContext>()
    .AddDefaultTokenProviders();
builder.Services.AddTransient<IProductRepository, EFProductRepository>();
builder.Services.AddTransient<IOrderRepository, EFOrderRepository>();
builder.Services.AddScoped(SessionCart.GetCart);
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();
Разница только в синтаксисе, из-за встроенной поддержки, а смысл один и тот же.
3
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
16.05.2024, 09:43
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
DI для WEB и DI для клиента используются одинаково, технология ничем не отличается, только нюансами из-за встроенных возможностей ASP NET Core MVC.
В плане view model да. Отличий почти нет. Но если у интерфейса vm есть команды, то для web этот интерфейс не подойдет.
И придется реализовывать другой интерфейс. Что ставит в выбор не писать эти команды для vm web и клиента в интерфейсе. Но смысл один и тот же. Не пишем то что нельзя сделать для другого приложения. То есть контракт между vm и интерфейсов не 100% идет. Если стремиться к 100% то придется реализовать разные интерфейсы для клиента и web. Но тогда di теряет свою силу в плане максимальной полезности, в плане web для контролеров становится бесполезным.
Поэтому я написал примерные связки где представляю di полезным. Там где контракт будет стремиться к 100%
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
16.05.2024, 09:46
Цитата Сообщение от xellan24rus Посмотреть сообщение
в плане web для контролеров становится бесполезным.
А это что?
C#
1
2
3
4
5
6
7
8
9
public class ProductController : Controller
{
    private readonly IProductRepository _repository;
    
    public ProductController(IProductRepository repository)
        => _repository = repository;
        
    // ...
}
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
16.05.2024, 09:56
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А это что?
Репозиторий.
К Icommand, ActionResult, ViewResult и т.п это не относится. Я имел ввиду про те вызовы которые берут view из view model.
Это зависимые вызовы для конкретных типов приложений.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
16.05.2024, 10:20
Цитата Сообщение от xellan24rus Посмотреть сообщение
Это зависимые вызовы для конкретных типов приложений.
А я вам что говорю???
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Конечно не подойдёт. Это ведь абсолютно разные вещи, мало того - абсолютно разные паттерны.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
VM для WEB это просто набор свойств из разных классов модели в который контроллер пишет свои данные, а представление привязывает свой источник данных к этой VM.
Это абсолютно разное, хоть и название одинаковое. Не путайте технологии для Desktop и WEB.

Добавлено через 1 минуту
xellan24rus,
Desktop - MVP, MVVM.
WEB - MVC.

Добавлено через 1 минуту
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Desktop - MVP, MVVM.
Даже тут разница огромная между этими двумя вещами, и используются для разных технологий. Первый - Windows Forms, второй - WPF, Avalonia, Xamarin, MAUI.

Добавлено через 5 минут
Цитата Сообщение от xellan24rus Посмотреть сообщение
Репозиторий.
Да, но как он появляется в контроллере? Методом внедрения зависимости через DI...
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
16.05.2024, 11:03
Andrey-MSK,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Даже тут разница огромная между этими двумя вещами, и используются для разных технологий. Первый - Windows Forms, второй - WPF, Avalonia, Xamarin, MAUI.
Я про тоже, что нет универсального решения. И такие жесткие контракты для view не получатся. Откидываем то что нельзя реализовать от интерфейса и делаем

Добавлено через 35 секунд
В целом я давно вас понял. Произошло не допонимание просто =\
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
15.02.2026, 21:42
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Сообщение от Andrey-MSK : У меня все VM запущены через DI с модификатором Transient.

Один из моментов за что я их не люблю.
Размазывание функционала между слоями, хотя декларируется, то они создаются наоборот для лучшей изоляции.
Я точно могу сказать, что ваше решение это костыль. Возможно он вынужденный и по другому с DI нельзя, но это уже другой вопрос.
Если экземпляр VM гарантированно единственный в один момент времени, то я бы его прокидывал из окна в локатор и другим окном получал оттуда.
Тоже костыль, но уже не настолько кривой.
? как он может быть гарантированно единственным, если под каждую View (xaml) лучше делать свою VM, насколько я поняла (мне так показалось - для чистоты архитектуры)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.02.2026, 00:54
Цитата Сообщение от JeyCi Посмотреть сообщение
? как он может быть гарантированно единственным, если под каждую View (xaml) лучше делать свою VM, насколько я поняла (мне так показалось - для чистоты архитектуры)
Если мы говорим о MVVM, то ViewModel - это слой. Функция этого слоя - это отражение Model в удобном для View виде.

Когда же говорим о РЕАЛИЗАЦИИ, то часто вместо слоя (в том числе View и Model) подразумеваем не сам слой, а какой-то объект иногда полностью, иногда частично представляющий функционал слоя.
Так же и в вашем вопросе. Здесь подразумевается что есть некое представление какого-то ограниченного функционала Модели. И под экземпляр этого представление создаётся экземпляр ViewModel.
Например, такое характерно при реализации редактирования сущностей репозитория.
Model отдаёт поставщикам сущности в read-only типах. Для их редактирования создаётся оболочка ViewModel сущности. Тем самым у нас есть исходная сущность-образец, функционал Модели по изменению хранилища представляемого этой сущностью, и механизмы обновления сущности при обновлении хранилища.

Я же говорил, о неком "лице" ViewModel. Объекте (обычно представленного через интерфейс), который представляет основной функционал ViewModel/ Можно сказать о Main-ViewModel. Такой объект по практике обычно бывает синглтоном. Так же очень часто синглтонами бывают его дочерние VM. Очень часто такое делается для много страничных приложений, где каждая страница представляет какой-то свой тип контента. Например, страница редактора, страница настроек приложений, страница открытия файла и т.п.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2026, 00:54

SelectedItem не работает у ListBox
Здравствуйте, SelectedItem не возвращает значение выбранного элемента, отсюда этот элемент я не могу удалить из списка. ListBox у меня...

Не работает SelectedItem Binding в ListBox
Использую MVVM. Есть ListBox: &lt;ListBox HorizontalContentAlignment=&quot;Stretch&quot; SelectedItem=&quot;{Binding SelectedUser}&quot;...

Сброс значения ListBox SelectedItem
Всем привет. Есть код: MyImages p = listBox.SelectedItem as MyImages; if (p != null) ...

SelectedItem в listbox последнего элемента
как при добавлении в Listbox элемента, именно на нем было выделение. Т.е. выделялся последний добавленный в список элемент. Используется...

listBox.SelectedItem - обращение к несуществующему объекту
Ошибка: Object reference not set to an instance of an object. говорит о попытке сослаться на несуществующий в момент обращения к нему...


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

Или воспользуйтесь поиском по форуму:
78
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты 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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru