Как отобразить текст по умолчанию «--Select Team -» в поле со списком при загрузке страницы в WPF? - PullRequest
93 голосов
/ 15 сентября 2009

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

"- Выбрать команду -"

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

Происходит выбор данных из БД. Мне нужно отображать текст по умолчанию, пока пользователь не выберет элемент из поля со списком.

Пожалуйста, ведите меня

Ответы [ 23 ]

1 голос
/ 14 апреля 2017

РЕДАКТИРОВАТЬ: Согласно комментариям ниже, это не решение. Не знаю, как у меня это получилось, и не могу проверить этот проект.

Пришло время обновить этот ответ для последней версии XAML.

Найдя этот вопрос в поисках решения этого вопроса, я обнаружил, что у обновленной спецификации XAML есть простое решение.

Атрибут «Заполнитель» теперь доступен для выполнения этой задачи. Это так просто (в Visual Studio 2015):

<ComboBox x:Name="Selection" PlaceholderText="Select...">
    <x:String>Item 1</x:String>
    <x:String>Item 2</x:String>
    <x:String>Item 3</x:String>
</ComboBox>
1 голос
/ 07 января 2014

Я бы порекомендовал следующее:

Определить поведение

public static class ComboBoxBehaviors
{
    public static readonly DependencyProperty DefaultTextProperty =
        DependencyProperty.RegisterAttached("DefaultText", typeof(String), typeof(ComboBox), new PropertyMetadata(null));

    public static String GetDefaultText(DependencyObject obj)
    {
        return (String)obj.GetValue(DefaultTextProperty);
    }

    public static void SetDefaultText(DependencyObject obj, String value)
    {
        var combo = (ComboBox)obj;

        RefreshDefaultText(combo, value);

        combo.SelectionChanged += (sender, _) => RefreshDefaultText((ComboBox)sender, GetDefaultText((ComboBox)sender));

        obj.SetValue(DefaultTextProperty, value);
    }

    static void RefreshDefaultText(ComboBox combo, string text)
    {
        // if item is selected and DefaultText is set
        if (combo.SelectedIndex == -1 && !String.IsNullOrEmpty(text))
        {
            // Show DefaultText
            var visual = new TextBlock()
            {
                FontStyle = FontStyles.Italic,
                Text = text,
                Foreground = Brushes.Gray
            };

            combo.Background = new VisualBrush(visual)
            {
                Stretch = Stretch.None,
                AlignmentX = AlignmentX.Left,
                AlignmentY = AlignmentY.Center,
                Transform = new TranslateTransform(3, 0)
            };
        }
        else
        {
            // Hide DefaultText
            combo.Background = null;
        }
    }
}

Пользовательское поведение

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>
1 голос
/ 01 июля 2014

Ответ IceForge был довольно близок, и AFAIK - самое простое решение этой проблемы. Но он что-то пропустил, так как он не работал (по крайней мере, для меня он никогда не отображал текст).

В конце концов, вы не можете просто установить для свойства «Видимость» TextBlock значение «Скрытый», чтобы его можно было скрыть, когда выбранный элемент поля со списком не равен нулю; Вы должны установить его таким образом по умолчанию (поскольку вы не можете проверить не нуль в триггерах , используя Setter в XAML в том же месте, что и триггеры.

Вот фактическое решение, основанное на его, отсутствующий Сеттер, помещенный непосредственно перед Триггерами:

<ComboBox x:Name="combo"/>
<TextBlock Text="--Select Team--" IsHitTestVisible="False">
    <TextBlock.Style>
        <Style TargetType="TextBlock">

            <Style.Setters>
                <Setter Property="Visibility" Value="Hidden"/>
            </Style.Setters>

            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=combo,Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
0 голосов
/ 12 января 2017
InitializeComponent()
yourcombobox.text=" -- Select Team --";

Приведенный выше код демонстрирует самый простой способ достичь этого. После загрузки окна объявите текст комбинированного списка, используя свойство .Text комбинированного списка. Это может быть расширено до DatePicker, Textbox и других элементов управления.

0 голосов
/ 12 июля 2016

Немного поздно, но ..

Более простым способом было бы добавить фиктивный элемент данных в список с параметром IsDummy = true и убедиться, что это не HitTestVisable, а его высота составляет 1 пиксель (с помощью конвертера), поэтому его не будет видно.

Затем просто зарегистрируйтесь в SelectionChanged и в нем установите индекс на индекс фиктивного элемента.

Это работает как шарм, и таким образом вы не будете связываться со стилем и цветами ComboBox или темой вашего приложения.

0 голосов
/ 15 августа 2013

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

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

0 голосов
/ 29 октября 2015

// XAML код

// код модели представления

    private CategoryModel _SelectedCategory;
    public CategoryModel SelectedCategory
    {
        get { return _SelectedCategory; }
        set
        {
            _SelectedCategory = value;
            OnPropertyChanged("SelectedCategory");
        }
    }

    private ObservableCollection<CategoryModel> _Categories;
    public ObservableCollection<CategoryModel> Categories
    {
        get { return _Categories; }
        set
        {
            _Categories = value;
            _Categories.Insert(0, new CategoryModel()
            {
                CategoryId = 0,
                CategoryName = " -- Select Category -- "
            });
            SelectedCategory = _Categories[0];
            OnPropertyChanged("Categories");

        }
    }
0 голосов
/ 18 августа 2013

Только установите для атрибута IsEditable значение true

<ComboBox Name="comboBox1"            
          Text="--Select Team--"
          IsEditable="true"  <---- that's all!
          IsReadOnly="true"/>
0 голосов
/ 06 июня 2018

Я сделал это перед тем, как связать комбинированный список с данными из базы данных в коде, подобном этому -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
0 голосов
/ 07 апреля 2014

Я знаю, что это полу-старый, но как насчет этого:

<DataTemplate x:Key="italComboWM">
    <TextBlock FontSize="11" FontFamily="Segoe UI" FontStyle="Italic" Text="--Select an item--" />
</DataTemplate>

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...