Я создал элемент управления отчетом, который принимает набор параметров, привязанных к базовому объекту, и генерирует элементы управления с помощью селектора шаблона данных.
<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.com/help/mcve
Решение - минимальное полное воспроизведение вопроса. Некоторые проблемы более сложны, чем можно описать в одном файле кода. Я, конечно, не знаю, как уменьшить проблему, помимо того, что я там сделал. Если да, пожалуйста, дайте мне знать, чтобы я мог облегчить себе тренировку. Я использовал наименьшую абстракцию, которая все еще воспроизводит проблему.
Наконец-то мне удалось загрузить ваш исходный код, и мой антивирус не помешал. Честно говоря, я думаю, что вы все еще можете сделать это в одностраничном вопросе. Сейчас я ищу возможные способы решения этой проблемы. Вы видите, что с такими вопросами у вас будет нулевой шанс найти решение, и он не будет бесполезен для веб-сайта и его людей. просто говорю.
Я сдался! Предлагаю задать еще один вопрос с минимально возможный код. в прилагаемом решении есть масса дополнительных кодов, которые доставляют головную боль любому, кто хочет отладить этот беспорядок! так что, пожалуйста, приложить больше усилий, чтобы задать хороший вопрос.
есть некоторые примечания: 0. не усложняйте слишком много 1. не привязывайте представление к другому представлению (ContentControl to ReportView) используйте вместо этого MVVM 2. используйте связываемые свойства 3. не изменяйте метаданные DP
Как бы вы предложили загружать динамически загружаемый отчет в представление без использования элемента управления содержимым? Я нарушаю MVVM таким образом, потому что нет другого способа связать представление с чем-то, что динамически загружается в другое представление.
не привязывайте взгляды. загрузить соответствующую виртуальную машину в содержимое элемента управления контентом и позволить элементу управления контентом выбрать правильный вид для своего содержимого.
Как это сделать, если xaml для этого контента поступает из того же источника, что и модель представления?
xaml for that content comes from the same source as the view model
вы можете привязать столько представлений, сколько хотите, к одному источнику виртуальной машины. это не значит, что это содержимое должно быть связано друг с другом. они представляют собой изображения одного и того же источника, которые оказываются похожими друг на друга.
Хорошо, у меня есть виртуальные машины a, b и c в import.dll (загружены с использованием архитектуры надстройки), а также представления x, y и z. Как mainview узнает, какое представление использовать для vm a, учитывая, что main.dll поздно привязан к import.dll из-за использования надстроек.
Решением было сохранить источник элементов как частное значение в ReportParameter и внутренне привязать элемент управления к этому внутреннему значению, а не к привязанному внешнему значению.
Причина этого в том, что WPF отбрасывает и повторно создает пользовательский интерфейс при каждом изменении элемента поля со списком. Таким образом, источник элементов обнуляется, что впоследствии устанавливает нулевое значение в выбранное значение.
добро пожаловать в stackoverflow! прочтите, пожалуйста, stackoverflow.com/help/mcve, также не ссылайтесь на исполняемые файлы, это очень небезопасно.