Попробуйте следующее:
int main()
{
cout << std::boolalpha << a << endl << b; //1
}
Вы увидите, что теперь получаете «истинное». Это просто неявное преобразование в стрельбу bool
.
Я сделал это, прежде чем связывать комбобокс с данными из базы данных в codebehind вроде этого -
Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
Самый простой способ, который я нашел для этого, это:
<ComboBox Name="MyComboBox"
IsEditable="True"
IsReadOnly="True"
Text="-- Select Team --" />
Вам, очевидно, нужно будет добавить другие параметры, но это, вероятно, самый простой способ сделать это.
Однако есть один недостаток этого метода, который, пока текст внутри вашего поля со списком не будет доступен для редактирования, он по-прежнему выбирается. Однако, учитывая низкое качество и сложность каждой альтернативы, которую я нашел на сегодняшний день, это, вероятно, лучший вариант.
Я считаю, что водяной знак, упомянутый в этом сообщении в этом сообщении , будет хорошо работать в этом случае
. Требуется немного кода, но вы можете повторно использовать его для любого combobox или текстового поля (и даже пароли), поэтому я предпочитаю этот путь
Мне нравится ответ 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>
// Код 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");
}
}
Немного поздно, но ..
Более простым способом было бы добавить фиктивный элемент данных в список с параметром IsDummy = true и убедиться, что он не является HitTestVisable, а его высота равна 1 пикселю ( используя конвертер), поэтому его не видно.
Вместо того, чтобы просто зарегистрироваться в SelectionChanged и в нем, установите индекс в индекс фиктивного элемента.
Он работает как шарм и этот способ вы не испортите стиль и цвета ComboBox или темы вашего приложения.
Никто не сказал, что чистое решение 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>
<Setter Property="Visibility" Value="Hidden"/>
за курок (внутри стиля) и удаление Visibility="Hidden"
из фактического элемента текстового блока
– BroSlow
23 May 2015 в 01:39
InitializeComponent()
yourcombobox.text=" -- Select Team --";
Приведенный выше код демонстрирует самый простой способ его достижения. После загрузки окна объявите текст комбобокса, используя свойство .Text в поле со списком. Это также можно расширить до DatePicker, Textbox и других элементов управления.
Не лучшая практика ... но отлично работает ...
<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;
}
}
}
Установите IsEditable = True в элементе Combobox. Это отобразит свойство Text для Combobox
Не пробовал это с помощью комбинированных ящиков, но это работало для меня с другими элементами управления ...
Он использует слой adorner здесь для отображения водяного знака.
Решение 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>
Я не знаю, поддерживается ли это напрямую, но вы можете наложить комбо с меткой и установить его в скрытое, если выбор не равен нулю.
например.
<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;
}
РЕДАКТИРОВАТЬ: По комментариям ниже, это не решение. Не знаю, как я работал, и не могу проверить этот проект.
Пришло время обновить этот ответ для последнего 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>
System.Windows.ComboBox
нет свойства PlaceholderText
. Это вопрос о WPF, а не WinForms.
– Sheridan
19 December 2017 в 10:05
Я использую класс 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>
Вы можете сделать это без какого-либо кода с помощью 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"
Очень приятная вещь в этом подходе - это не повторение кода в коде.
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}" />
Я бы рекомендовал следующее:
Определить поведение
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 --"/>
Установите для атрибута IsEditable значение true
<ComboBox Name="comboBox1"
Text="--Select Team--"
IsEditable="true" <---- that's all!
IsReadOnly="true"/>
Самый простой способ - использовать 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>