如何在WPF的pageload中的组合框中显示默认文本"--Select Team - "?

Ram*_*amm 97 wpf combobox

在WPF应用程序中,在MVP应用程序中,我有一个组合框,我显示从数据库获取的数据.在项目添加到组合框之前,我想显示默认文本,如

" - 选择团队 - "

因此,在页面加载时,它会显示并在选择它时应清除文本并显示项目.

正在从DB中选择数据.我需要显示默认文本,直到用户从组合框中选择一个项目.

请指导我

Chr*_*ter 97

我发现这样做最简单的方法是:

<ComboBox Name="MyComboBox"
 IsEditable="True"
 IsReadOnly="True"
 Text="-- Select Team --" />
Run Code Online (Sandbox Code Playgroud)

您显然需要添加其他选项,但这可能是最简单的方法.

但是这种方法有一个缺点,即组合框内的文本不可编辑,但仍然可以选择.然而,鉴于迄今为止我发现的每种替代品的质量和复杂性都很差,这可能是最好的选择.

  • 简单而有效的解决方案 WPF控件在整个框架中都存在这种问题.在这里和那里,控件缺少大多数开发人员需要的功能.结果,开发人员浪费时间寻找解决方案,购买第三方替代控制或实施变通方法...... WPF团队是否甚至将他们的控件用于他们自己的开发? (7认同)
  • 完美答案克里斯.一个财产可以做出如此大的不同:D (5认同)
  • `Focusable ="False"IsEditable ="True"IsReadOnly ="True"` (3认同)

Tri*_*ran 87

你可以通过使用a而无需任何代码IValueConverter.

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

在这里,您有可以重复使用的转换器类.

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
}
Run Code Online (Sandbox Code Playgroud)

最后,您需要在资源部分声明转换器.

<Converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />
Run Code Online (Sandbox Code Playgroud)

转换器是放置转换器类的地方.一个例子是:

xmlns:Converters="clr-namespace:MyProject.Resources.Converters"
Run Code Online (Sandbox Code Playgroud)

这种方法非常好用的是不会在代码中重复代码.

  • 实际上你可以使用`DataTrigger`来避免转换器代码在这里:) (2认同)

Hap*_*mad 47

我喜欢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>
Run Code Online (Sandbox Code Playgroud)


Ice*_*rge 31

没有人说纯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>
Run Code Online (Sandbox Code Playgroud)

  • 我需要将"Visibility ="Hidden"移动到数据触发器中.然后它按预期工作.绝对是我见过的最直接的方法.为了可重用性,我将样式转换为资源 (4认同)

小智 22

在Combobox元素上设置IsEditable = True.这将显示Combobox的Text属性

  • 它确实改变了控件的外观 (5认同)
  • 这是所有解决方案中最简单的解决方案。 (2认同)

Pau*_*ulB 15

我不知道它是否直接支持但你可以用标签覆盖组合,如果选择不为空则将其设置为隐藏.

例如.

<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>
Run Code Online (Sandbox Code Playgroud)

然后在选择更改处理程序...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
Run Code Online (Sandbox Code Playgroud)


too*_*too 7

根据IceForge 的回答,我准备了一个可重用的解决方案:

xml风格:

<Style x:Key="ComboBoxSelectOverlay" TargetType="TextBlock">
    <Setter Property="Grid.ZIndex" Value="10"/>
    <Setter Property="Foreground" Value="{x:Static SystemColors.GrayTextBrush}"/>
    <Setter Property="Margin" Value="6,4,10,0"/>
    <Setter Property="IsHitTestVisible" Value="False"/>
    <Setter Property="Visibility" Value="Hidden"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

使用示例:

<Grid>
     <ComboBox x:Name="cmb"
               ItemsSource="{Binding Teams}" 
               SelectedItem="{Binding SelectedTeam}"/>
     <TextBlock DataContext="{Binding ElementName=cmb,Path=SelectedItem}"
               Text=" -- Select Team --" 
               Style="{StaticResource ComboBoxSelectOverlay}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)