当我在WPF中创建一个组合框时,我希望它的名字就像“你的选择”,就像它是一个普通的按钮,当我点击它时,我只想要下拉的项目,而不是名字再次在组合框上。我希望你理解我的问题?有办法解决这个问题吗?
在XAML中,我将它用于组合框:
<ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" SelectionChanged="cmbChangeRoute_SelectionChanged" />
我在C#代码中添加了这样的项目:
string[] strChangeRoute = new string[] { "Your choice", "10 deg", "20 deg", "30 deg" };
foreach (string s in strChangeRoute)
cmbChangeRoute.Items.Add(s);
cmbChangeRoute.SelectedIndex = 0;
答案 0 :(得分:2)
我会在ComboBox上找一个TextBlock,它的可见性将绑定到ComboBox的selectedItem(通过转换器)。
<Grid>
<ComboBox x:Name="myComboBox" />
<TextBlock Text="Your choice.."
IsHitTestVisible="False"
Visibility="{Binding ElementName=myComboBox, Path=SelectedItem,
Converter={StaticResource yourChoiceLabelVisibilityConverter}}"/>
</Grid>
public class YourChoiceLabelVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if (value == null)
{
return Visibility.Visible;
}
return Visibility.Hidden;
}
OR,更好的解决方案:纯xaml,使用触发器:
<ContentControl x:Name="myContentControl" Content="{Binding}">
<ContentControl.ContentTemplate>
<DataTemplate>
<Grid>
<ComboBox x:Name="myComboBox" ItemsSource="{Binding}"/>
<TextBlock x:Name="myTextBlock"
Text="Your choice.."
IsHitTestVisible="False"
Visibility="Hidden"/>
</Grid>
<DataTemplate.Triggers>
<Trigger SourceName="myComboBox" Property="SelectedItem"
Value="{x:Null}">
<Setter TargetName="myTextBlock" Property="Visibility
Value="Visible"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
在这种情况下,不要忘记从代码隐藏中设置内容控件的datacontext:
myContentControl.DataContext = Enum.GetValues(typeof([YOUR ENUM]));
答案 1 :(得分:2)
试试这个,我只是测试了它
<ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" IsManipulationEnabled="False" IsEditable="True" Text="Your Choice..." SelectionChanged="cmbChangeRoute_SelectionChanged">
答案 2 :(得分:2)
您是否尝试过使用绑定?
在XAML中你有类似
的东西<ComboBox ... SelectedItem="{Binding ChosenValue,Mode=TwoWay}" ... />
然后,在你的构造函数中(在代码隐藏中)只需添加行
this.DataContext = this;
这样你的绑定实际上会在代码隐藏中找到依赖属性ChosenValue。这样,每次组合框中的值更改时,prop的值将更新为保存当前选定的项目。
要实现您想要的效果,只需在构造函数
中将prop的值设置为“Your Choice”public ClassName()
{
InitializeComponent();
this.DataContext = this;
ChosenValue = "Your Choice";
}
同样,只需将其值设置为您想要的任何其他位置的相同字符串。保存或其他什么时,请检查
if(!ChosenValue.Equals("Your Choice")
{
//do logic
}
else
{
//the user has not selected anything
}
希望这有帮助!
答案 3 :(得分:2)
你想要做的事实上不是配置ComboBox,而是在其上添加一个装饰器/装饰器,它会在Combo关闭时显示文本,并且当组合关闭时会隐藏自己。它有时被称为“水印”。
我不会进一步解释,因为它毫无意义。这是一篇很好的文章:http://pwlodek.blogspot.com/2009/11/watermark-effect-for-wpfs-textbox.html还有为组合框加水印所需的所有代码片段。
答案 4 :(得分:0)
你可以参考这个, How to display default text "--Select Team --" in combo box on pageload in WPF?
我会从这个论坛建议以下解决方案,
通过使用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"
这种方法非常好用的是不会在代码中重复代码。