отобразить текст по умолчанию для combobox wpf [duplicate]

Попробуйте следующее:

int main()
{
    cout << std::boolalpha << a << endl << b; //1
}

Демо

Вы увидите, что теперь получаете «истинное». Это просто неявное преобразование в стрельбу bool.

90
задан stema 29 April 2013 в 14:55
поделиться

23 ответа

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

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
0
ответ дан bax 1188 21 August 2018 в 07:11
поделиться
  • 1
    Это просто добавляет текст в качестве опции в раскрывающемся списке. Это не то, о чем просил ОП. – Dean Friedland 2 July 2018 в 16:58
  • 2
    речь идет о добавлении текста по умолчанию, и я сделал это таким образом – bax 1188 3 July 2018 в 08:19

Самый простой способ, который я нашел для этого, это:

<ComboBox Name="MyComboBox"
 IsEditable="True"
 IsReadOnly="True"
 Text="-- Select Team --" />

Вам, очевидно, нужно будет добавить другие параметры, но это, вероятно, самый простой способ сделать это.

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

88
ответ дан Chris Walter 21 August 2018 в 07:11
поделиться
  • 1
    Это лучше всего подходит для combobox. Благодаря! – henon 14 March 2013 в 19:54
  • 2
    Очень простой и лучший вариант в приложении MVVM, которое я создал. Большое спасибо – user 10 April 2013 в 14:49
  • 3
    идеальный ответ Крис. Одно свойство может иметь такую ​​большую разницу: D – Aster Veigas 8 September 2013 в 22:14
  • 4
    Focusable="False" IsEditable="True" IsReadOnly="True" – Kamil Lelonek 1 January 2014 в 03:38
  • 5
    Простое и эффективное решение. Элементы управления WPF имеют такие проблемы во всей структуре. Здесь и там элементы управления не имеют функций, которые потребуются большинству разработчиков. В результате разработчики тратят время на поиск решений, покупку сторонних альтернативных элементов управления или реализацию обходных решений ... Разве команда WPF даже использует свои средства управления для своих собственных разработок? – Damn Vegetables 10 January 2015 в 19:27

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

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

4
ответ дан Community 21 August 2018 в 07:11
поделиться
  • 1
    Ницца. Я расширил его, привязываясь к TextBlock DataContext, используя относительный источник, чтобы избежать необходимости устанавливать имя. См. Следующий комментарий для Markup (код в комментариях SO выглядит уродливым) – Sascha 14 October 2016 в 10:18
  • 2
    & lt; TextBlock DataContext = & quot; {Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}} & quot; Текст = & Quot; - Выбрать проект - & quot; Style = & quot; {StaticResource ComboBoxSelectOverlay} & quot; / & GT; – Sascha 14 October 2016 в 10:19

Мне нравится ответ Tri Q, но эти преобразователи ценности - боль в использовании. PaulB сделал это с обработчиком событий, но это тоже не нужно. Вот чистое решение XAML:

<ContentControl Content="{Binding YourChoices}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="Select Something" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate> 
</ContentControl>
46
ответ дан CrApHeR 21 August 2018 в 07:11
поделиться

// Код XAML

// Код ViewModel

    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
ответ дан crypticresearchlab 21 August 2018 в 07:11
поделиться

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

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

Вместо того, чтобы просто зарегистрироваться в SelectionChanged и в нем, установите индекс в индекс фиктивного элемента.

Он работает как шарм и этот способ вы не испортите стиль и цвета ComboBox или темы вашего приложения.

0
ответ дан Eibi 21 August 2018 в 07:11
поделиться

Никто не сказал, что чистое решение xaml должно быть сложным. Вот простой, с 1 триггером данных в текстовом поле. Маржа и позиция по желанию

<Grid>
    <ComboBox x:Name="mybox" ItemsSource="{Binding}"/>
    <TextBlock Text="Select Something" IsHitTestVisible="False">
           <TextBlock.Style>
                <Style TargetType="TextBlock">
                      <Setter Property="Visibility" Value="Hidden"/>
                      <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=mybox,Path=SelectedItem}" Value="{x:Null}">
                                  <Setter Property="Visibility" Value="Visible"/>
                             </DataTrigger>
                      </Style.Triggers>
                </Style>
           </TextBlock.Style>
     </TextBlock>
</Grid>
29
ответ дан JoanComasFdz 21 August 2018 в 07:11
поделиться
  • 1
    Понравилось это лучше, чем другие решения ... – Nishant 27 June 2013 в 15:29
  • 2
    Мне нужно было переместить & quot; Видимость = & quot; Скрытый & quot; в триггер данных. то он работал, как ожидалось. Определенно, самый прямой подход, который я видел. Для повторного использования я переместил стиль в ресурс – Mitch 9 August 2013 в 15:50
  • 3
    Ответ @Mitch IceForce не работает для меня, что вы изменили, чтобы заставить его работать? – Chris 30 April 2014 в 11:20
  • 4
    @Mitch вы можете разместить свой код? – Gilad 2 June 2014 в 12:50
  • 5
    @Chris Я думаю, что он имел в виду добавление <Setter Property="Visibility" Value="Hidden"/> за курок (внутри стиля) и удаление Visibility="Hidden" из фактического элемента текстового блока – BroSlow 23 May 2015 в 01:39
InitializeComponent()
yourcombobox.text=" -- Select Team --";

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

0
ответ дан Ketan Dubey 21 August 2018 в 07:11
поделиться

Не лучшая практика ... но отлично работает ...

<ComboBox GotFocus="Focused"  x:Name="combobox1" HorizontalAlignment="Left" Margin="8,29,0,0" VerticalAlignment="Top" Width="128" Height="117"/>

Код за

public partial class MainWindow : Window
{
    bool clearonce = true;
    bool fillonce = true;
    public MainWindow()
    {
        this.InitializeComponent();          
        combobox1.Items.Insert(0, " -- Select Team --");
        combobox1.SelectedIndex = 0;
    }

    private void Focused(object sender, RoutedEventArgs e)
    {
            if(clearonce)
            {
                combobox1.Items.Clear();
                clearonce = false;
            }
            if (fillonce)
            {
              //fill the combobox items here 
                for (int i = 0; i < 10; i++)
                {
                    combobox1.Items.Insert(i, i);
                }
                fillonce = false;
            }           
    }
}
0
ответ дан Madi D. 21 August 2018 в 07:11
поделиться

Установите IsEditable = True в элементе Combobox. Это отобразит свойство Text для Combobox

19
ответ дан medusa 21 August 2018 в 07:11
поделиться
  • 1
    Это самое простое решение из всей партии. – Sergey Koulikov 5 November 2012 в 04:27
  • 2
    он изменяет то, что выглядит элемент управления, хотя – simonalexander2005 5 September 2014 в 12:00

Не пробовал это с помощью комбинированных ящиков, но это работало для меня с другими элементами управления ...

ageektrapped blogpost

Он использует слой adorner здесь для отображения водяного знака.

4
ответ дан Nathan Hillyer 21 August 2018 в 07:11
поделиться
  • 1
    Просто скачал и пробовал этот код. Кажется, он работает как рекламируемый. Позволяет вам украсить вашу комбо простым прикрепленным свойством, содержащим ваш водяной знак. Он также работает и для других элементов управления. Это гораздо лучший подход, чем любой другой ответ на этот вопрос. – Ian Oakes 26 August 2011 в 11:20
  • 2
    Хороший материал, и не только он решает проблему ComboBox, но теперь я могу избавиться от сборки WPF Tools и просто использовать это в своих текстовых блоках, а не в контроле WatermarkedTextBox, так что полный выигрыш :) - о, btw, это A Geek Trapped not Согласованная ловушка! – dain 5 January 2012 в 15:19

Решение HappyNomad было очень хорошим и помогло мне в конечном итоге прийти к этому немного другому решению.

<ComboBox x:Name="ComboBoxUploadProject" 
    Grid.Row="2"
    Width="200" 
    Height="23"                           
    Margin="64,0,0,0"
    ItemsSource="{Binding projectList}"
    SelectedValue ="{Binding projectSelect}" 
    DisplayMemberPath="projectName"
    SelectedValuePath="projectId"
    >
    <ComboBox.Template>
        <ControlTemplate TargetType="ComboBox">
            <Grid>
                <ComboBox x:Name="cb" 
                    DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
                    ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
                    SelectedValue ="{Binding SelectedValue, RelativeSource={RelativeSource TemplatedParent}}" 
                    DisplayMemberPath="projectName"
                    SelectedValuePath="projectId"
                    />
                <TextBlock x:Name="tb" Text="Select Item..." Margin="3,3,0,0" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ComboBox.Template>
</ComboBox>
3
ответ дан Nick Falco 21 August 2018 в 07:11
поделиться

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

например.

<Grid>
   <ComboBox Text="Test" Height="23" SelectionChanged="comboBox1_SelectionChanged" Name="comboBox1" VerticalAlignment="Top" ItemsSource="{Binding Source=ABCD}"  />
   <TextBlock IsHitTestVisible="False" Margin="10,5,0,0" Name="txtSelectTeam" Foreground="Gray" Text="Select Team ..."></TextBlock>
</Grid>

Затем в выбранном измененном обработчике ...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
14
ответ дан PaulB 21 August 2018 в 07:11
поделиться
  • 1
    Вместо создания обработчика SelectionChanged видимость TextBlock может быть установлена ​​в XAML. – aliceraunsbaek 16 July 2013 в 13:40

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

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

Находя этот вопрос SO, ища решение этого вопроса, я обнаружил, что обновленная спецификация 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
ответ дан Robb Sadler 21 August 2018 в 07:11
поделиться
  • 1
    Я использовал это решение - помогает ли негативная избирательная система? Конечно, я не эксперт XAML, но он сработал. – Robb Sadler 26 October 2017 в 17:30
  • 2
    Хотя я не являюсь ни одним из избирателей, я полагаю, что вы отказались от голосования, потому что в классе System.Windows.ComboBox нет свойства PlaceholderText. Это вопрос о WPF, а не WinForms. – Sheridan 19 December 2017 в 10:05
  • 3
    Человек это странно - я знаю, что я работал над XAML-приложением, и я знаю, что только что открыл его и увидел, что он работает. Может быть, расширение было включено в проект? IDK. С тех пор я посмотрел и наверняка нет Placeholder в ComboBox. Я не могу вернуться к проекту, над которым работал старый клиент. тьфу. – Robb Sadler 29 March 2018 в 13:47

Я использую класс IsNullConverter в своем проекте, и это сработало для меня. вот код для него в c #, создайте папку с именем Converter и добавьте этот класс в эту папку, поскольку используемый триггер не поддерживает значение, а не null, а IsNullConverter просто делает это

 public class IsNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException("IsNullConverter can only be used OneWay.");
    }
}

add пространство имен в файле xaml.

xmlns:Converters="clr-namespace:TymeSheet.Converter"

означает, что

xmlns:Converters="clr-namespace:YourProjectName.Converter"

использует эту строку под ресурсами, чтобы сделать ее доступной через код xaml

<Converters:IsNullConverter x:Key="isNullConverter" />

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

<TextBlock Text="Select Project" IsHitTestVisible="False" FontFamily="/TimeSheet;component/Resources/#Open Sans" FontSize="14" Canvas.Right="191" Canvas.Top="22">
                        <TextBlock.Resources>
                            <Converters:IsNullConverter x:Key="isNullConverter"/>
                        </TextBlock.Resources>
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ElementName=ProjectComboBox,Path=SelectedItem,Converter={StaticResource isNullConverter}}" Value="False">
                                        <Setter Property="Visibility" Value="Hidden"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
0
ответ дан Safwan 21 August 2018 в 07:11
поделиться

Вы можете сделать это без какого-либо кода с помощью IValueConverter.

<Grid>
   <ComboBox
       x:Name="comboBox1"
       ItemsSource="{Binding MyItemSource}"  />
   <TextBlock
       Visibility="{Binding SelectedItem, ElementName=comboBox1, Converter={StaticResource NullToVisibilityConverter}}"
       IsHitTestVisible="False"
       Text="... Select Team ..." />
</Grid>

Здесь вы можете выбрать класс конвертера, который вы можете повторно использовать.

public class NullToVisibilityConverter : IValueConverter
{
    #region Implementation of IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

И, наконец, вам нужно объявить ваш конвертер в разделе ресурсов.

<Converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />

Где конвертеры - это место, где вы разместили класс конвертера. Например:

xmlns:Converters="clr-namespace:MyProject.Resources.Converters"

Очень приятная вещь в этом подходе - это не повторение кода в коде.

85
ответ дан Tri Q Tran 21 August 2018 в 07:11
поделиться
  • 1
    Хороший ответ, мне это нравится :) – Ian 13 August 2010 в 17:19
  • 2
    Все, что я могу сказать - WOW! – chopikadze 29 December 2011 в 10:53
  • 3
    Я хотел бы использовать это, но кажется, что это запрещено в случаях, когда combobox является заголовком datagrid. , , XAML дает ошибку, что заголовок уже определен (или, возможно, не может быть определен более одного раза). Есть идеи? Я думаю просто использовать параметр с нулевым значением, который затем позволит сбросить его, выбирая его, но кажется немного неряшливым. – Paul Gibson 29 January 2015 в 20:57
  • 4
    Большая причина, по которой это отличное решение, состоит в том, что почти каждый связанный с данными проект WPF использует NullToVisibilityConverter, так что он уже там в большинстве случаев - может также использовать его! – tpartee 16 June 2015 в 00:36
  • 5
    На самом деле вы можете использовать DataTrigger, чтобы избежать даже кода конвертера здесь :) – Billy ONeal 2 September 2015 в 18:17

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

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

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
-3
ответ дан user2638247 21 August 2018 в 07:11
поделиться
  • 1
    ComboBox не имеет свойства EmptySelectionBoxTemplate. – Novitchi S 29 May 2014 в 10:11

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

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

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
ответ дан Usman Zafar 21 August 2018 в 07:11
поделиться
  • 1
    Это работает как прелесть для одного комбинированного блока. Но когда я использую его с более чем 1 комбо, он дает мне ошибку (но компилируется и работает хорошо) и свойство «DefaultText» уже зарегистрировано «ComboBox» & quot ;. Я упомянул об исправлении в своем блоге. – Romesh D. Niriella 24 April 2014 в 10:30
  • 2
    Спасибо за указание на это. Я не смог выполнить эту ошибку на своем компьютере. Однако я согласен, что typeof (ComboBoxBehaviors) должен быть передан в третьем параметре RegisterAttached вместо typeof (ComboBox). – Usman Zafar 9 June 2014 в 17:50
  • 3
    Хотя этот пост немного стар, я не вижу, как он может работать. Bg combo устанавливается через триггеры с несколькими условиями. Попробуйте поместить комбо в сетку и вручную установите bg на «красный». Это не влияет на область, где вы хотите, чтобы водяной знак появился. Это может повлиять только на bg за панелью выпадающего меню. Лучшим решением является копирование шаблона управления combobox и добавление нескольких триггеров и стилей для рисования визуальной кисти, состоящей из текстового блока в фоновом режиме границы. – Wade 13 October 2016 в 18:27

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

<ComboBox Name="comboBox1"            
          Text="--Select Team--"
          IsEditable="true"  <---- that's all!
          IsReadOnly="true"/>
-3
ответ дан Xsan 21 August 2018 в 07:11
поделиться

Самый простой способ - использовать CompositeCollection для объединения текста и данных по умолчанию из базы данных непосредственно в ComboBox, например

    <ComboBox x:Name="SelectTeamComboBox" SelectedIndex="0">
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <ComboBoxItem Visibility="Collapsed">-- Select Team --</ComboBoxItem>
                <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=MyComboOptions}}"/>
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>

. И в ресурсах определить StaticResource для привязки параметров ComboBox к вашему DataContext, потому что прямое связывание в CollectionContainer doesn 't работает правильно.

<Window.Resources>
    <CollectionViewSource Source="{Binding}" x:Key="MyComboOptions" />
</Window.Resources>

Таким образом вы можете определить свои параметры ComboBox только в xaml, например

   <ComboBox x:Name="SelectTeamComboBox" SelectedIndex="0">
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <ComboBoxItem Visibility="Collapsed">-- Select Team --</ComboBoxItem>
                <ComboBoxItem >Option 1</ComboBoxItem>
                <ComboBoxItem >Option 2</ComboBoxItem>
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>
2
ответ дан Zap 21 August 2018 в 07:11
поделиться
4
ответ дан Community 1 November 2018 в 02:13
поделиться
0
ответ дан Yinon Dotan 1 November 2018 в 02:13
поделиться
4
ответ дан Community 1 November 2018 в 02:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: