В приложении WPF в приложении MVP у меня есть поле со списком, для которого я отображаю данные, полученные из базы данных. Перед элементами, добавленными в поле со списком, я хочу отобразить текст по умолчанию, например
" -- Выбрать команду --"
чтобы он отображался при загрузке страницы, а при ее выборе текст должен быть очищен, а элементы должны отображаться.
Происходит выбор данных из БД. Мне нужно отображать текст по умолчанию, пока пользователь не выберет элемент из поля со списком.
Пожалуйста, направь меня
Focusable="False" IsEditable="True" IsReadOnly="True"
Вы можете сделать это без какого-либо кода, используя файл
IValueConverter
.Здесь у вас есть класс конвертера, который вы можете использовать повторно.
И наконец, вам нужно объявить свой конвертер в разделе ресурсов.
Где Конвертеры - это место, где вы разместили класс конвертера. Пример:
Самое приятное в этом подходе - это отсутствие повторения кода в вашем коде.
источник
DataTrigger
чтобы избежать даже кода конвертера :)Мне нравится ответ Tri Q, но использовать эти преобразователи значений затруднительно. PaulB сделал это с помощью обработчика событий, но это тоже не нужно. Вот чистое решение XAML:
источник
Никто не сказал, что чистое решение xaml должно быть сложным. Вот простой вариант с 1 триггером данных в текстовом поле. Маржа и позиция по желанию
источник
<Setter Property="Visibility" Value="Hidden"/>
за пределами триггера (внутри стиля) и удалениеVisibility="Hidden"
из фактического элемента текстового блокаУстановить
IsEditable="True"
наComboBox
элемент. Это отобразитText
свойствоComboBox
.источник
Я не знаю, поддерживается ли это напрямую, но вы можете наложить на комбо метку и установить его скрытым, если выбор не равен нулю.
например.
Потом в выделении изменили обработчик ...
источник
Основываясь на ответе IceForge, я подготовил многоразовое решение:
xaml стиль:
пример использования:
источник
Не пробовал с полями со списком, но у меня это сработало с другими элементами управления ...
пост в блоге ageektrapped
Он использует здесь декоративный слой для отображения водяного знака.
источник
Решение HappyNomad было очень хорошим и помогло мне в конечном итоге прийти к этому немного другому решению.
источник
Самый простой способ - использовать CompositeCollection для объединения текста по умолчанию и данных из базы данных непосредственно в ComboBox, например.
А в разделе "Ресурсы" определите StaticResource для привязки параметров ComboBox к вашему DataContext, поскольку прямая привязка в CollectionContainer работает некорректно.
Таким образом, вы можете определить свои параметры ComboBox только в xaml, например
источник
Я бы порекомендовал следующее:
Определите поведение
Пользователь поведение
источник
Ответ IceForge был довольно близок, и, как мне кажется , это самое простое решение этой проблемы. Но он что-то упустил, так как он не работал (по крайней мере, для меня он никогда не отображает текст).
В конце концов, вы не можете просто установить для свойства «Visibility» TextBlock значение «Hidden», чтобы оно было скрыто, когда выбранный элемент поля со списком не равен нулю; вы должны установить его таким образом по умолчанию (поскольку вы не можете проверить, не является ли значение NULL в триггерах , используя Setter в XAML в том же месте, что и триггеры.
Вот фактическое решение, основанное на его, отсутствующий Сеттер помещается непосредственно перед Триггерами:
источник
РЕДАКТИРОВАТЬ: Согласно комментариям ниже, это не решение. Не знаю, как это работает, и не могу проверить этот проект.
Пришло время обновить этот ответ для последней версии XAML.
Обнаружив этот вопрос SO в поисках решения этого вопроса, я обнаружил, что обновленная спецификация XAML имеет простое решение.
Атрибут под названием «Заполнитель» теперь доступен для выполнения этой задачи. Это так просто (в Visual Studio 2015):
источник
PlaceholderText
вSystem.Windows.ComboBox
классе нет собственности . Это вопрос о WPF, а не о WinForms.Не лучшая практика .. но работает нормально ...
Код позади
источник
Я считаю, что в этом случае подойдет водяной знак, упомянутый в этом посте.
Требуется немного кода, но вы можете повторно использовать его для любого поля со списком или текстового поля (и даже для ящиков с паролями), поэтому я предпочитаю этот способ
источник
Я использую в своем проекте класс IsNullConverter, и он у меня сработал. вот код для него на С #, создайте папку с именем Converter и добавьте этот класс в эту папку, поскольку используемый триггер не поддерживает значение, а не null, и IsNullConverter просто делает это
добавьте пространство имен в файл xaml следующим образом.
средства
используйте эту строку под ресурсами, чтобы сделать его доступным через код xaml
вот код xaml, я использовал здесь триггер, поэтому всякий раз, когда элемент выбирается в поле со списком, видимость вашего текста становится ложной.
источник
// Код XAML
// Код ViewModel
источник
Немного поздно, но ..
Более простой способ - добавить фиктивный элемент данных в список с параметром IsDummy = true и убедиться, что это не HitTestVisable, а его высота составляет 1 пиксель (с помощью конвертера), чтобы его не было видно.
Затем просто зарегистрируйтесь в SelectionChanged и в нем установите индекс на индекс фиктивного элемента.
Он работает как шарм, и таким образом вы не путаетесь со стилем и цветами ComboBox или темой вашего приложения.
источник
Приведенный выше код демонстрирует простейший способ добиться этого. После загрузки окна объявите текст поля со списком, используя свойство .Text поля со списком. Это также можно распространить на DatePicker, Textbox и другие элементы управления.
источник
Я сделал это до того, как связать поле со списком с данными из базы данных в коде, например:
источник
Поместите метку поверх поля со списком.
Привяжите содержимое метки к свойству текста поля со списком.
Установите прозрачность поля со списком на ноль, непрозрачность = 0.
Записать текст по умолчанию в свойство текста поля со списком
источник
Только установите для атрибута IsEditable значение true
источник
Я знаю, что это наполовину старое, но как насчет этого:
источник
ComboBox
не имеетEmptySelectionBoxTemplate
собственности.