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

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

    <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
0
14
64
1

Ответы 1

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

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

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