1

当我在 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;
4

5 回答 5

2

您想要做的实际上不是配置 ComboBox,而是在其上添加一个装饰器/装饰器,它会在 Combo 关闭时显示一个文本,并且在组合关闭时会隐藏自身。它有时被称为“水印”。

我不会进一步解释它,因为它毫无意义。这是一篇不错的文章:http : //pwlodek.blogspot.com/2009/11/watermark-effect-for-wpfs-textbox.html 还有为组合框加水印所需的所有代码片段。

于 2012-08-10T09:50:47.737 回答
2

您是否尝试过使用绑定?

在 XAML 中你有类似的东西

<ComboBox ... SelectedItem="{Binding ChosenValue,Mode=TwoWay}" ... />

然后,在您的构造函数中(在代码隐藏中)只需添加该行

this.DataContext = this;

这样您的绑定实际上会在代码隐藏中查找依赖属性 ChosenValue。这样,每次更改组合框中的值时,您的道具值都会更新以保存当前选定的项目。

要实现您想要的,只需在构造函数中将道具的值设置为“您的选择”

public ClassName()
{
   InitializeComponent();
   this.DataContext = this;
   ChosenValue = "Your Choice";
}

同样,只需将其值设置为您想要的其他任何地方的相同字符串。保存或其他时,只需检查

if(!ChosenValue.Equals("Your Choice")
{
   //do logic
}
else
{
   //the user has not selected anything
}

希望这可以帮助!

于 2012-08-10T09:45:05.613 回答
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;
    }

或者,更好的解决方案:纯 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>

在这种情况下,不要忘记从代码隐藏中设置内容控件的数据上下文:

myContentControl.DataContext = Enum.GetValues(typeof([YOUR ENUM]));
于 2012-08-10T09:31:20.420 回答
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">
于 2012-08-10T09:35:05.100 回答
0

您可以参考这篇文章, 如何在 WPF 页面加载的组合框中显示默认文本“--Select Team --”?

我会从这个论坛建议以下解决方案,

您可以使用 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" />

Converters 是您放置转换器类的位置。一个例子是:

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

这种方法的好处是在你的代码中没有重复代码。

于 2012-08-10T10:10:41.393 回答