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

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

30.04.2024, 11:59. Показов 9077. Ответов 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 4
15.05.2024, 10:39
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может не совсем врубаюсь для какой задачи такое, вообще, может понадобиться.
Мне нужно по команде из одного окна, которое не диалог, заполнить нужные данные в другом окне, при этом первое окно должно остаться на экране, потому и не диалог. Придумал вот такой вариант...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.05.2024, 10:50
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Придумал вот такой вариант...
Ну, выглядит как дикий костыль.
"Данные"- это функция VM. Окна как бы не причём должны быть.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 4
15.05.2024, 10:52
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"Данные"- это функция VM. Окна как бы не причём должны быть.
Дак я и работаю с VM, просто получаю экземпляр который в настоящее время используется в открытом окне.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
15.05.2024, 11:24
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
просто получаю экземпляр который в настоящее время используется в открытом окне.
У вас несколько экземпляров VM?
Тогда не понятно почему нужен первый.
А если один, то почему не используете локатор, например.
0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 4
15.05.2024, 11:34
Элд Хасп, У меня все VM запущены через DI с модификатором Transient.
C#
1
.AddTransient<IWorkDrawDataSetDialogVM, WorkDrawDataSetDialogVM>()
Поэтому при каждом открытии окна создаётся свой экземпляр VM именно для этого окна.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Тогда не понятно почему нужен первый.
Потому что для этой цели открывается всего одно такое окно. Тут конечно можно еще покумекать, если окон будет, для другого случая, больше... Но пока еще такая необходимость не возникала
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 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
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,710
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
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, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru