Сброс параметров динамического поля со списком

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

    <local:ReportControl Grid.Row = "1" Grid.ColumnSpan = "2">
        <local:ReportControl.Parameters>
            <local:ReportParameter Label = "Combo Box" ItemsSource = "{Binding ItemsSource}" Value = "{Binding [value]}"/>
            <local:ReportParameter Label = "Text" Value = "{Binding [text]}"/>
        </local:ReportControl.Parameters>
    </local:ReportControl>

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

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

Класс TestViewModel настраивает отчеты, а MainWindow настраивает основной пользовательский интерфейс для отображения отчетов. Чтобы смоделировать тот факт, что в производственном приложении отчеты могут поступать из нескольких мест и, следовательно, иметь собственное представление, прикрепленное для отдельной конфигурации параметров, в классе отчета есть объект ReportView, который объявляет параметры, как указано выше. Наконец, ReportControl и ReportParameter воспроизводят элемент управления Main report и добавленные параметры. Я реализовал только базовый текст и список полей со списком в качестве параметров, чтобы доказать, что это проблема с привязками поля со списком. Селектор шаблонов и перечисление типов данных также можно найти в ReportParameter.cs.

У кого-нибудь есть идеи, почему поля со списком сбрасываются, но они не сбрасываются, если отчет настроен в xaml без дополнительной абстракции с использованием элемента управления содержимым? Также были бы полезны идеи, как это исправить.

Обновлено: загруженное решение на GitHub, чтобы упростить доступ для людей.

добро пожаловать в stackoverflow! прочтите, пожалуйста, stackoverflow.com/help/mcve, также не ссылайтесь на исполняемые файлы, это очень небезопасно.

Bizhan 10.08.2018 17:47

Я думал, что позаботился о том, чтобы исполняемые двоичные файлы были удалены из решения, которое я заархивировал. Если это не так, я удалю все, что пропустил, и добавлю ссылку на новую копию. - изменить - я удалил все исполняемые файлы, и это также наименьший объем кода, с помощью которого я мог воспроизвести проблему.

Phoenix Stoneham 11.08.2018 13:34

также прочтите ссылку, чтобы задать хороший вопрос с большим количеством ответов. и ссылка по-прежнему небезопасна. лучше по возможности не использовать внешние ссылки.

Bizhan 11.08.2018 13:38

Как мне тогда загрузить решение? Поскольку в настоящее время он находится на моем личном диске

Phoenix Stoneham 11.08.2018 18:32

избегайте загрузки файлов решений. вместо этого постарайтесь задать минимальный, полный и проверяемый вопрос. stackoverflow.com/help/mcve

Bizhan 11.08.2018 18:39

Решение - минимальное полное воспроизведение вопроса. Некоторые проблемы более сложны, чем можно описать в одном файле кода. Я, конечно, не знаю, как уменьшить проблему, помимо того, что я там сделал. Если да, пожалуйста, дайте мне знать, чтобы я мог облегчить себе тренировку. Я использовал наименьшую абстракцию, которая все еще воспроизводит проблему.

Phoenix Stoneham 12.08.2018 19:13

Наконец-то мне удалось загрузить ваш исходный код, и мой антивирус не помешал. Честно говоря, я думаю, что вы все еще можете сделать это в одностраничном вопросе. Сейчас я ищу возможные способы решения этой проблемы. Вы видите, что с такими вопросами у вас будет нулевой шанс найти решение, и он не будет бесполезен для веб-сайта и его людей. просто говорю.

Bizhan 12.08.2018 20:16

Я сдался! Предлагаю задать еще один вопрос с минимально возможный код. в прилагаемом решении есть масса дополнительных кодов, которые доставляют головную боль любому, кто хочет отладить этот беспорядок! так что, пожалуйста, приложить больше усилий, чтобы задать хороший вопрос.

Bizhan 12.08.2018 21:17

есть некоторые примечания: 0. не усложняйте слишком много 1. не привязывайте представление к другому представлению (ContentControl to ReportView) используйте вместо этого MVVM 2. используйте связываемые свойства 3. не изменяйте метаданные DP

Bizhan 12.08.2018 21:24

Как бы вы предложили загружать динамически загружаемый отчет в представление без использования элемента управления содержимым? Я нарушаю MVVM таким образом, потому что нет другого способа связать представление с чем-то, что динамически загружается в другое представление.

Phoenix Stoneham 13.08.2018 11:04

не привязывайте взгляды. загрузить соответствующую виртуальную машину в содержимое элемента управления контентом и позволить элементу управления контентом выбрать правильный вид для своего содержимого.

Bizhan 13.08.2018 11:10

Как это сделать, если xaml для этого контента поступает из того же источника, что и модель представления?

Phoenix Stoneham 14.08.2018 12:50
xaml for that content comes from the same source as the view model вы можете привязать столько представлений, сколько хотите, к одному источнику виртуальной машины. это не значит, что это содержимое должно быть связано друг с другом. они представляют собой изображения одного и того же источника, которые оказываются похожими друг на друга.
Bizhan 14.08.2018 12:58

Хорошо, у меня есть виртуальные машины a, b и c в import.dll (загружены с использованием архитектуры надстройки), а также представления x, y и z. Как mainview узнает, какое представление использовать для vm a, учитывая, что main.dll поздно привязан к import.dll из-за использования надстроек.

Phoenix Stoneham 14.08.2018 13:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
14
64
1

Ответы 1

Решением было сохранить источник элементов как частное значение в ReportParameter и внутренне привязать элемент управления к этому внутреннему значению, а не к привязанному внешнему значению.

Причина этого в том, что WPF отбрасывает и повторно создает пользовательский интерфейс при каждом изменении элемента поля со списком. Таким образом, источник элементов обнуляется, что впоследствии устанавливает нулевое значение в выбранное значение.

Другие вопросы по теме