powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Будет ли течь память?
16 сообщений из 16, страница 1 из 1
Будет ли течь память?
    #39624017
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, многие сталкивались с ситуацией, когда нужно поменять DataTemplate после того, как поменялось значение, от которого зависит DataTemplate. Популярный в интернете метод следующий:
Код: 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.
41.
public class MultiBorderTemplateSelector : DataTemplateSelector
    {

        public DataTemplate OneBorderTemplate { get; set; }
        public DataTemplate MultyBorderTemplate { get; set; }


        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {

           notifiedClass _notifiedClass = (notifiedClass)item;

                PropertyChangedEventHandler lambda = null;
                lambda = (o, args) =>
                {
                    if (args.PropertyName == "ChangedProperty")
                    {
                        fl.PropertyChanged -= lambda;
                        var cp = (ContentPresenter)container;
                        Application.Current.Dispatcher.Invoke(
                            () =>
                            {
                                cp.ContentTemplateSelector = null;
                                cp.ContentTemplateSelector = this;
                            }
                            );
                    }
                };
                _notifiedClass.PropertyChanged += lambda;
           

            if (!_notifiedClass.ChangedProperty)
            {
                return OneBorderTemplate;
            }
            else
            {
                return MultyBorderTemplate;
            }
        }
    }



Все работает, вопрос в следующем при уничтожении объекта _notifiedClass будут ли ссылки храниться и приводить к memory leak?
Так же есть вариант для данной ситуации с DataTrigger

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    <Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required">
          <Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed">
          <Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" />
        </DataTrigger>
        <!--  your other Status' here -->
      </Style.Triggers>
    </Style>



Какой вариант предпочтительней?
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624024
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от того, что за тип у тебя "notifiedClass"
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624033
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
это простой класс, экземпляры которого используются для биндинга. Самая регулярная ситуация.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624046
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дак ведь не Selector ссылается на notifiedClass, а наоборот.
а вообще очень странное применение Selector'а, непонятно зачем там вообще события.
Селектор шаблона должен выдавать шаблон, а все события связанные с его обновлением не должны его касаться. Это должно происходить в модели\представлении
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624052
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataTemplateSelector вызывается только при инициализации объекта и соответственно анализирует свойство, по которому выдает нужный DataTemplate . Однако если в процессе это свойство поменяется, то DataTemplateSelector заново не отрабатывает. Вот к чему такое использование селектора.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624060
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subВот к чему такое использование селектора.а что за задача?
В прошлом коде у тебя со стилями было слишком наворочено imho.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624077
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
я думаю каждый сталкивался с такой задачей, когда у например есть 2 DataTemplate, в зависимости от определенного свойства выбирается один из темплейтов. При инициализации отрабатывает DataTemplateSelector и выбирается соответственно DataTemplate . Потом у забинденного объекта это свойство меняется и нужно перерисовать новый DataTemplate.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624082
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я было пытался сделать селектор, мне не понравилась его никакая работа с байндингами, я плюнул и сделал автоматический выбор шаблона по типу класса из ресурсного словаря. И не нужно никаких селекторов и триггеров.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624086
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа вместо разного значения какого-то свойства используются два разных класса (им никто не мешает наследоваться от одного базового. При этом раз у тебя разные темлейты, наверняка и классы в чем-то будут отличаться
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624091
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
такой подход к сожалению не подойдет, потому что класс должен быть именно один. Может будет понятнее на следующем примере:
есть Textblock, он прибинден к определенному свойству класса. Это свойство меняется и Вы хотите визуально показать, что свойство поменялось- например сделать BackGround другим цветом- экземпляр класса должен быть тем же.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624096
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно конечно и через конвертер заморочится, но тогда datatrigger проще.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624103
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subвизуально показать, что свойство поменялось
Сам менял свойство? Тогда странно.
Менялось в базе другим юзверем?
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624126
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
можно самому свойство поменять, можно по-другому -не суть важно.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624139
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subЭто свойство меняется и Вы хотите визуально показать, что свойство поменялось- например сделать BackGround другим цветом- экземпляр класса должен быть тем же.Нужно показать факт изменения свойства? Тогда анимация. Или подсвечивать определенные значения? Тогда триггер или конвертер. На крайняк, цвет может формировать сама VM
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624145
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subPetro123,
можно самому свойство поменять, можно по-другому -не суть важно.
По постановке задачи, задача странная.
Кода по стилям больше чем кода по функционалу (за что платят в корпоративе) в три раза больше.
У меня подозрение, что задачу можно решить другим способом и не заботится об утечке памяти.
...
Рейтинг: 0 / 0
Будет ли течь память?
    #39624165
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

да, переписыванием контенттемплэйта

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  <Style x:Key="selectableContentStyle" TargetType="{x:Type ContentControl}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Required">
          <Setter Property="ContentTemplate" Value="{StaticResource requiredTemplate}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="Completed">
          <Setter Property="ContentTemplate" Value="{StaticResource completedTemplate}" />
        </DataTrigger>
        <!--  your other Status' here -->
      </Style.Triggers>
    </Style>
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Будет ли течь память?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]