С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Заблокирован
WPF

Обновить Source для вложенного элемента

25.06.2019, 16:38. Показов 2118. Ответов 8

Студворк — интернет-сервис помощи студентам
Есть класс окна. В нём есть Grid и в нём есть Image. Source картинки привязан к свойству в классе окна. Как-то так:
XML
1
2
3
4
5
<Window>
    <Grid>
        <Image x:Name="SomeImage" Source="SomeProperty">
    </Grid>
</Window>
SomeProperty в классе окна объявлено так:
C#
1
2
3
4
5
6
7
8
9
10
11
private BitmapImage _bitmap;
        
public BitmapImage SomeProperty
{
    get { return _bitmap; }
    set
    {
        _bitmap = value;
        ((Image) FindName("SomeImage")).Source = _bitmap;
    }
}
Когда я окну передаю картинку, она показывается в контроле Image. Работает, но я так понимаю, что это некорректный подход. Подскажите, пожалуйста, как это делать правильно.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2019, 16:38
Ответы с готовыми решениями:

Обновить Image.Source из другого потока
Есть Image. Есть метод Render(), который долго выполняется и возвращает WriteableBitmap. Необходимо периодически обновлять Image.Source,...

Z-index не работает для вложенного элемента относительно родительского
Здравствуйте, опишу проблему, допустим имеется простая компоновка: &lt;div style=&quot;width:100%; height:50px; background: red;...

Атрибут Name элемента, вложенного в UserControl
Столкнулся с такой ошибкой: Ошибка 1 значение атрибута Name &quot;textBox1&quot; невозможно задать для элемента &quot;TextBox&quot;, так как он...

8
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
25.06.2019, 20:00
Ну почему же, свойства удобны, чтобы можно было управлять как на входе, так и на выходе

Добавлено через 1 минуту
Цитата Сообщение от NightmareZ Посмотреть сообщение
SomeProperty в классе окна
Лучше все-таки использовать модель представления
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,043
Записей в блоге: 2
25.06.2019, 22:39
Лучший ответ Сообщение было отмечено NightmareZ как решение

Решение

Цитата Сообщение от NightmareZ Посмотреть сообщение
Source картинки привязан к свойству в классе окна. Как-то так:
Цитата Сообщение от NightmareZ Посмотреть сообщение
Работает, но я так понимаю, что это некорректный подход. Подскажите, пожалуйста, как это делать правильно.
Свойство в окне объявляете так
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
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        #region Реализация INPC
        /// <summary>Событие для извещения об изменения свойства</summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>Метод для вызова события извещения об изменении свойства</summary>
        /// <param name="propertyName">Изменившееся свойство</param>
        public void OnPropertyChanged([CallerMemberName]string propertyName = "") =>
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        #endregion
 
        private ImageSource _bitmap;
 
        public ImageSource SomeProperty
        {
            get { return _bitmap; }
            set
            {
                _bitmap = value;
                OnPropertyChanged();
            }
        }
 
        public MainWindow()
        {
            InitializeComponent();
        }
    }
Привязка в XAML будет такой
XML
1
        <Image Source="{Binding SomeProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"/>
Или если в XAML дать имя окну, то такой
XML
1
2
3
4
5
<Window  x:Name="wind">
    <Grid>
        <Image x:Name="SomeImage" Source="{Binding SomeProperty, ElementName=wind}">
    </Grid>
</Window>
1
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
26.06.2019, 11:16
1) Файл *.xaml.cs лучше всего оставлять пустым с конструктором по-умолчанию. Так как любой функционал можно реализовать, не задействуя code-behind. А привязывать функционал к контролу совсем не обязательно.
2) Тип ImageSource определяется в сборке PresentationCore.dll. Это значит, что он является платформазависимым типом, и во ViewModel платформазависимые типы лучше не использовать, если мы желаем сохранять уровни абстракции.

Исходя из этого "правильная реализация" будет выглядеть так:
C#
1
2
3
4
public class ViewModel
{
    public string FileLocation { get; set; }
}
XML
1
<Image Source="{Binding FileLocation, Converter={FileLocationToImageConverter}}" />
где FileLocationToImageConverter - конвертер, который по пути получает ImageSource картинки

Или

C#
1
2
3
4
public class ViewModel
{
    public byte[] ImageBytes { get; set; }
}
XML
1
<Image Source="{Binding ImageBytes, Converter={BytesToImageConverter}}" />
где BytesToImageConverter - конвертер, который массива байт преобразует в ImageSource
3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,043
Записей в блоге: 2
26.06.2019, 13:10
Цитата Сообщение от novikov.ea Посмотреть сообщение
Файл *.xaml.cs лучше всего оставлять пустым с конструктором по-умолчанию. Так как любой функционал можно реализовать, не задействуя code-behind.
NightmareZ, прислушайтесь к совету novikov.ea.
Для экспериментов, обучения ещё допустимо использовать CB для работы данных. Но в реальном приложении так делать нельзя.

CB окна это тоже часть View. Там может содержаться какой-либо код для работы самой View, eго контролов и то только если не хватает возможностей XAML. Для работы с данными необходима ViewModel и её надо выделить из View. Желательно даже разделять по отдельным проектам View, ViewModel и Model. Ну в край, хотя бы по отдельным папкам.
1
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
26.06.2019, 13:27
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там может содержаться какой-либо код для работы самой View, eго контролов и то только если не хватает возможностей XAML
Да. Например, в code-behind мы можем:
1) генерировать и запускать нетривиальную анимацию, которая зависит от множества параметров.
2) устанавливать фокус на элементах управления
3) обрабатывать события, приводящие к некоторым действиям со View (не связанным с бизнес-логикой)
Однако, любой класс должен придерживаться Single Responsibility Principle. А если мы пропишем все вышеперечисленные случаи в code-behind, то у класса будет много ответственностей. Поэтому вместо реализации всех указанных функциональностей в code-behind следует реализовывать Behavior для каждого их них. Тогда каждый отдельный Behavior будет удовлетворять принципу единственной ответственности, а за View останется только его прямая ответственность - отображать данные. А его code-behind по прежнему останется чистым, как душа младенца.
3
Заблокирован
26.06.2019, 17:42  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
следует реализовывать Behavior для каждого их них
А вот тут можно подробнее, как это делать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11239 / 2887
Регистрация: 21.04.2018
Сообщений: 33,043
Записей в блоге: 2
26.06.2019, 17:54
Цитата Сообщение от NightmareZ Посмотреть сообщение
Цитата Сообщение от novikov.ea Посмотреть сообщение
следует реализовывать Behavior для каждого их них
А вот тут можно подробнее, как это делать?
novikov.ea, я бы попросил даже чтобы сделали тему-гайд по созданию Behavior.
У меня лично "туго" с этим.
1
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
26.06.2019, 19:26
Да тут гайда и не требуется)
Подключаете System.Windows.Interactivity.dll через References или устанавливаете NuGet пакет Microsoft.Xaml.Behaviors.Wpf. Наследуетесь от Behavior<T>, описываете в нём поведение и подключаете его к контролу
XML
1
2
3
4
5
<AnyControl>
  <i:Interactivity.Behaviors>
    <MyAwesomeBehavior />
  </i:Interactivity.Behaviors>
</AnyControl>
Всё

Добавлено через 36 минут
Вместо i:Interactivity.Behaviors нужно i:Interaction.Behaviors
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2019, 19:26
Помогаю со студенческими работами здесь

Не могу добраться до вложенного элемента
Всем привет! Есть такой код: &lt;h3 class=&quot;active&quot;&gt;Заголовок&lt;/h3&gt; &lt;div style=&quot;display: block;&quot;&gt; &lt;form class=&quot;readac&quot;...

Выбор элемента из вложенного foreach
Существует скрипт парсинга exel-файла на основе PHPExel. Там 2 вложенных foreach. Если обращаемся к первому циклу, то можно легко...

Удаление вложенного элемента списка
Есть такой список, с вложенными словарями и списками ip_addr=}, {'IP':'192.16.101.34', 'OS':'Linux', ...

SASS @extend наследования из вложенного элемента
Поскажите как павильно из этого кода проэкстедить .eq_more .eq_i_right{ float: right; width: 60%; display: block; ...

Как получить Uid из вложенного элемента в listBox
Доброй ночи, только начал изучать wpf и c#, и столкнулся с непредвиденными трудностями со стороны listbox'a. А именно, не могу достать Uid...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru