Как использовать WPF/SL Grid и GridSplitter в качестве привязываемого SplitContainer?

Предположим, вы хотите разрешить пользователю изменять размер сетки WPF/SL, содержащей два столбца. Но вы также хотите разрешить пользователю скрывать один столбец ("панель") или другой столбец. Когда показаны оба столбца (панели), также должен быть показан GridSplitter; в противном случае нет. Вы также хотите использовать привязки в стиле MVVM без кода. И, возможно, вы хотите сохранить настройки между сессиями. У вас есть эти свойства в вашей модели представления:

bool IsPanelOneVisible

bool IsPanelTwoVisible

GridLength SplitPosition

Так, как я могу связать это, используя только привязки?

Обратите внимание, что ширина столбца сетки (устанавливается с помощью привязки или на Авто) переопределяется, когда пользователь перетаскивает GridSplitter.

Ни один из постов, которые я просматривал (включая пару реализаций SplitContainer), не рассматривает этот сценарий в начале. Можно связать это, используя программный код (в ответ на события) или дополнительные свойства в модели представления. Но я надеялся на более элегантное решение.

Есть идеи? Спасибо!

1 ответ

Решение

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

Проблема заключается в том, что размер первого столбца изменяется с размера в пикселях (изменяемого размера с помощью разделителя) на автоматический размер и обратно. Видимость разделителя также может меняться в зависимости от того, как вы хотите, чтобы он работал.

После того, как вы создадите пользовательский элемент управления для выполнения всей задачи, вы перестанете беспокоиться о MVVM изнутри (выделениекода не является злом для пользовательских элементов управления, только на уровне приложения) и будете беспокоиться только о предоставлении дружественных свойств MVVM, таких как IsPanelOneVisible и т.п.

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