Làm cách nào để hiển thị văn bản mặc định “--Select Team -” trong hộp tổ hợp khi tải trang trong WPF?


109

Trong ứng dụng WPF, trong ứng dụng MVP, tôi có một hộp tổ hợp để tôi hiển thị dữ liệu được lấy từ Cơ sở dữ liệu. Trước khi các mục được thêm vào hộp Tổ hợp, tôi muốn hiển thị văn bản mặc định như

" -- Chọn đội --"

để khi tải trang, nó sẽ hiển thị và khi chọn nó, văn bản sẽ được xóa và các mục sẽ được hiển thị.

Việc chọn dữ liệu từ DB đang diễn ra. Tôi cần hiển thị văn bản mặc định cho đến khi người dùng chọn một mục từ hộp tổ hợp.

Xin vui lòng hướng dẫn cho tôi

Câu trả lời:


107

Cách dễ nhất mà tôi đã tìm thấy để làm điều này là:

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

Rõ ràng là bạn sẽ cần thêm các tùy chọn khác của mình, nhưng đây có lẽ là cách đơn giản nhất để thực hiện.

Tuy nhiên, có một nhược điểm của phương pháp này là trong khi văn bản bên trong hộp tổ hợp của bạn sẽ không thể chỉnh sửa được, nó vẫn có thể chọn được. Tuy nhiên, với chất lượng kém và độ phức tạp của mọi phương án mà tôi tìm thấy cho đến nay, đây có lẽ là lựa chọn tốt nhất hiện có.


Câu trả lời tuyệt vời Chris! Tôi chỉ cần thêm Focusable = "True", nhưng đó chỉ là thay đổi về mặt thẩm mỹ.
Slavisa

6
câu trả lời hoàn hảo Chris. Một tài sản có thể làm nên sự khác biệt lớn như vậy: D
Aster Veigas

4
Focusable="False" IsEditable="True" IsReadOnly="True"
Kamil Lelonek

1
+1. Rất tiếc, nó không hoạt động với các mục hỗn hợp (ví dụ: nếu các mục combobox là hình ảnh).
greenoldman,

11
Giải pháp đơn giản và hiệu quả. Các điều khiển WPF có loại vấn đề này trên toàn bộ khuôn khổ. Ở đây và ở đó, các điều khiển thiếu các tính năng mà hầu hết các nhà phát triển cần. Kết quả là, các nhà phát triển lãng phí thời gian tìm kiếm giải pháp, mua các biện pháp kiểm soát thay thế của bên thứ ba hoặc triển khai các giải pháp thay thế ... Nhóm WPF thậm chí có sử dụng các biện pháp kiểm soát cho sự phát triển của riêng họ không?
Các loại rau Chết tiệt

90

Bạn có thể làm điều này mà không cần bất kỳ mã nào bằng cách sử dụng một IValueConverter.

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

Ở đây bạn có lớp chuyển đổi mà bạn có thể sử dụng lại.

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
}

Và cuối cùng, bạn cần khai báo trình chuyển đổi của mình trong phần tài nguyên.

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

Nơi Converters là nơi bạn đã đặt lớp chuyển đổi. Một ví dụ là:

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

Điều rất hay về cách tiếp cận này là không có mã lặp lại trong mã của bạn phía sau.


Tôi muốn sử dụng điều này, nhưng có vẻ như nó không được phép trong trường hợp hộp tổ hợp là tiêu đề của một lưới dữ liệu. . . XAML đưa ra lỗi rằng tiêu đề đã được xác định (hoặc có lẽ không thể được xác định nhiều lần). Bất kỳ ý tưởng? Tôi đang nghĩ chỉ sử dụng một tùy chọn giá trị null, sau đó sẽ cho phép thiết lập lại bằng cách chọn nó, nhưng có vẻ hơi cẩu thả.
Paul Gibson

1
Một lý do lớn khiến đây là một giải pháp tuyệt vời là vì hầu như mọi dự án WPF liên kết dữ liệu đều sử dụng NullToVisibilityConverter, vì vậy nó đã ở đó hầu hết thời gian - cũng có thể tận dụng nó!
tpartee

2
Trên thực tế bạn có thể sử dụng một DataTriggerđể tránh thậm chí mã chuyển đổi ở đây :)
Billy Oneal

49

Tôi thích câu trả lời của Tri Q, nhưng những bộ chuyển đổi giá trị đó là một điều khó sử dụng. PaulB đã làm điều đó với một trình xử lý sự kiện, nhưng điều đó cũng không cần thiết. Đây là một giải pháp XAML tinh khiết:

<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>

33

Không ai nói rằng một giải pháp xaml tinh khiết phải phức tạp. Đây là một cách đơn giản, với 1 trình kích hoạt dữ liệu trên hộp văn bản. Ký quỹ và vị trí như mong muốn

<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>

5
Tôi cần thiết để di chuyển "Tầm nhìn =" ẩn" vào cò súng dữ liệu sau đó nó làm việc như mong đợi Chắc chắn cách tiếp cận về phía trước nhất straigh Tôi đã nhìn thấy Đối với reuseability, tôi chuyển phong cách vào một nguồn tài nguyên...
Mitch

Câu trả lời của @Mitch IceForce không phù hợp với tôi, bạn đã thay đổi điều gì để nó hoạt động?
Chris

1
@Chris Tôi nghĩ ý của anh ấy là thêm <Setter Property="Visibility" Value="Hidden"/>bên ngoài trình kích hoạt (bên trong kiểu) và xóa Visibility="Hidden"khỏi phần tử khối văn bản thực tế
Phục hồi Monica Vui lòng

@Mitch, làm cách nào để bạn chuyển kiểu Textblock thành tài nguyên để sử dụng lại nếu bạn có ElementName trong DataTrigger trỏ đến một đối tượng cụ thể (mybox)? Có cách nào để chỉ định tên đó một cách chung chung?
CrApHeR

24

Đặt IsEditable="True"trên ComboBoxphần tử. Điều này sẽ hiển thị thuộc Texttính của ComboBox.


2
Đây là giải pháp đơn giản nhất trong số toàn bộ lô.
Sergey Koulikov

6
nó vẻ thay đổi gì việc kiểm soát như mặc dù
simonalexander2005

16

Tôi không biết liệu nó có được hỗ trợ trực tiếp hay không nhưng bạn có thể phủ kết hợp bằng một nhãn và đặt nó thành ẩn nếu lựa chọn không rỗng.

ví dụ.

<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>

Sau đó, trong phần lựa chọn đã thay đổi trình xử lý ...

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

1
Thay vì tạo một trình xử lý SelectionChanged, khả năng hiển thị của TextBlock có thể được đặt trong XAML.
aliceraunsbaek

6

Dựa trên câu trả lời của IceForge, tôi đã chuẩn bị một giải pháp có thể tái sử dụng:

phong cách xaml:

<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>

ví dụ sử dụng:

<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>

Đẹp. Tôi đã loại bỏ nó bằng cách liên kết DataContext của TextBlock bằng cách sử dụng một nguồn tương đối để tránh phải đặt tên. Xem các bình luận tiếp theo cho Markup (mã trong ý kiến SO trông xấu xí)
Sascha

<TextBlock DataContext = "{Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}}" Text = "- Chọn dự án -" Style = "{StaticResource ComboBoxSelectOverlay}" />
Sascha

4

Không thử với hộp kết hợp nhưng điều này đã hoạt động với tôi với các điều khiển khác ...

bài đăng trên blog của ageektrapped

Anh ấy sử dụng lớp tô điểm ở đây để hiển thị hình mờ.


Chỉ cần tải xuống và thử mã này. Nó dường như hoạt động như quảng cáo. Cho phép bạn trang trí tổ hợp của mình bằng một thuộc tính đính kèm đơn giản có chứa hình mờ của bạn. Nó cũng hoạt động cho các điều khiển khác. Đó là một cách tiếp cận tốt hơn nhiều so với bất kỳ câu trả lời nào khác cho câu hỏi này.
Ian Oakes

Tốt, không chỉ nó giải quyết được vấn đề ComboBox, mà bây giờ tôi có thể loại bỏ lắp ráp Công cụ WPF và chỉ sử dụng nó trên TextBox của tôi thay vì điều khiển WatermarkedTextBox, quá đầy chiến thắng :) - oh btw, đó là A Geek Trapped không phải Cạm bẫy đồng ý!
dain

2

Giải pháp của HappyNomad rất tốt và cuối cùng đã giúp tôi đi đến giải pháp hơi khác này.

<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>

2

Cách dễ nhất là sử dụng CompositeCollection để hợp nhất văn bản và dữ liệu mặc định từ cơ sở dữ liệu trực tiếp trong ComboBox, ví dụ:

    <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>

Và trong phần Tài nguyên, định nghĩa StaticResource để ràng buộc các tùy chọn ComboBox với DataContext của bạn, bởi vì liên kết trực tiếp trong CollectionContainer không hoạt động chính xác.

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

Bằng cách này, bạn có thể xác định các tùy chọn ComboBox của mình chỉ trong xaml, ví dụ:

   <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>

1

Tôi muốn giới thiệu những điều sau:

Xác định một hành vi

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;
        }
    }
}

Hành vi của người dùng

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>

Điều này hoạt động giống như một sự quyến rũ cho một hộp kết hợp duy nhất. Nhưng khi tôi sử dụng nó với nhiều hơn 1 combo, nó báo lỗi cho tôi (nhưng biên dịch và chạy tốt) "Thuộc tính 'DefaultText' đã được đăng ký bởi 'ComboBox'". Tôi đã đề cập đến bản sửa lỗi trong blog của mình.
Romesh D. Niriella

Cảm ơn vì đã chỉ ra điều này. Tôi không thể tạo ra lỗi này trên máy tính của mình. Tuy nhiên, tôi đồng ý rằng typeof (ComboBoxBehaviors) nên được truyền vào tham số thứ 3 của RegisterAttached thay vì typeof (ComboBox).
Usman Zafar

Mặc dù bài này hơi cũ nhưng tôi không thấy nó hoạt động được như thế nào. Bg của kết hợp được thiết lập thông qua trình kích hoạt với nhiều điều kiện. Hãy thử đặt một tổ hợp trên lưới và đặt bg thành 'đỏ' theo cách thủ công. Nó không ảnh hưởng đến khu vực mà bạn muốn hình mờ xuất hiện. Nó có thể chỉ ảnh hưởng đến bg phía sau bảng điều khiển thả xuống. Một giải pháp tốt hơn là sao chép mẫu điều khiển của combobox và thêm một vài trình kích hoạt và kiểu để vẽ một bàn chải trực quan bao gồm một khối văn bản vào nền của đường viền.
Newclique

1

Câu trả lời của IceForge khá gần và AFAIK có phải là giải pháp dễ dàng nhất cho vấn đề này. Nhưng nó đã bỏ lỡ điều gì đó, vì nó không hoạt động (ít nhất là đối với tôi, nó không bao giờ thực sự hiển thị văn bản).

Cuối cùng, bạn không thể chỉ đặt thuộc tính "Visibility" của TextBlock thành "Hidden" để ẩn nó khi mục đã chọn của hộp tổ hợp không phải là rỗng; bạn phải THIẾT LẬP theo cách đó theo mặc định (vì bạn không thể kiểm tra trình kích hoạt không null bằng cách sử dụng Bộ định vị trong XAML ở cùng nơi với Trình kích hoạt.

Đây là giải pháp thực tế dựa trên của anh ta, Setter bị mất tích được đặt ngay trước Trigger:

<ComboBox x:Name="combo"/>
<TextBlock Text="--Select Team--" IsHitTestVisible="False">
    <TextBlock.Style>
        <Style TargetType="TextBlock">

            <Style.Setters>
                <Setter Property="Visibility" Value="Hidden"/>
            </Style.Setters>

            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=combo,Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

1

CHỈNH SỬA: Theo nhận xét bên dưới, đây không phải là một giải pháp. Không chắc mình đã làm việc như thế nào và không thể kiểm tra dự án đó.

Đã đến lúc cập nhật câu trả lời này cho XAML mới nhất.

Tìm câu hỏi SO này để tìm giải pháp cho câu hỏi này, sau đó tôi thấy rằng thông số XAML được cập nhật có một giải pháp đơn giản.

Một thuộc tính có tên "Trình giữ chỗ" hiện có sẵn để thực hiện tác vụ này. Nó đơn giản như sau (trong 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>

Tôi đã sử dụng giải pháp này - người bỏ phiếu tiêu cực có quan tâm đến việc giải thích không? Đã cho tôi không phải là chuyên gia XAML, nhưng nó đã hoạt động.
Robb Sadler

1
Mặc dù tôi không phải là người bỏ phiếu nhưng tôi tưởng tượng rằng bạn đã bị bỏ phiếu vì không có PlaceholderTexttài sản trong System.Windows.ComboBoxlớp . Đây là một câu hỏi về WPF, không phải WinForms.
Sheridan

Thật là kỳ lạ - tôi biết tôi đang làm việc trên một ứng dụng XAML và tôi biết tôi vừa phát hiện ra điều này và thấy nó hoạt động. Có thể một phần mở rộng đã được bao gồm trong dự án? IDK - Tôi đã xem xét và chắc chắn rằng không có Trình giữ chỗ trong ComboBox. Tôi không thể quay lại dự án mà tôi đang làm - khách hàng cũ. ugh.
Robb Sadler

2
Bạn không sai, nhưng điều đó không dành cho WPF. UWP ComboBox có cái này, vui lòng xem trang này: msdn.microsoft.com/en-us/library/windows/apps/…
laishiekai

0

Không phải phương pháp hay nhất..nhưng hoạt động tốt ...

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

Mã ẩn

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

Tôi tin rằng hình mờ như được đề cập trong bài đăng này sẽ hoạt động tốt trong trường hợp này

Cần một chút mã nhưng bạn có thể sử dụng lại nó cho bất kỳ hộp tổ hợp hoặc hộp văn bản nào (và thậm chí cả hộp mật khẩu) nên tôi thích cách này hơn


0

Tôi đang sử dụng lớp IsNullConverter trong dự án của mình và nó phù hợp với tôi. đây là mã cho nó trong c #, hãy tạo một thư mục có tên Converter và thêm lớp này vào thư mục đó, vì trình kích hoạt được sử dụng không hỗ trợ giá trị thay vì null và IsNullConverter chỉ làm điều đó

 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.");
    }
}

thêm không gian tên trong tệp xaml như thế này.

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

có nghĩa

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

sử dụng dòng này bên dưới các tài nguyên để làm cho nó có sẵn thông qua mã xaml

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

đây là mã xaml, tôi đã sử dụng trình kích hoạt ở đây để bất cứ khi nào một mục được chọn trong hộp kết hợp, độ hiển thị của văn bản của bạn sẽ trở thành sai.

<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

// Mã XAML

// Mã 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

Hơi muộn nhưng ..

Một cách đơn giản hơn là thêm một mục dữ liệu giả vào danh sách với tham số IsDummy = true và đảm bảo rằng nó không phải là HitTestVisable và chiều cao của nó là 1 pixel (sử dụng Bộ chuyển đổi) để nó sẽ không bị nhìn thấy.

Hơn chỉ cần đăng ký với SelectionChanged và trong đó, đặt chỉ mục thành chỉ mục mục giả.

Nó hoạt động giống như một sự quyến rũ và theo cách này, bạn sẽ không gây rối với phong cách và màu sắc của ComboBox hoặc chủ đề ứng dụng của mình.


0
InitializeComponent()
yourcombobox.text=" -- Select Team --";

Đoạn mã trên minh họa cách đơn giản nhất để đạt được nó. Sau khi tải cửa sổ, khai báo văn bản của combobox, sử dụng thuộc tính .Text của combobox. Điều này cũng có thể được mở rộng cho DatePicker, Textbox và các điều khiển khác.


0

Tôi đã làm điều đó trước khi liên kết hộp kết hợp với dữ liệu từ cơ sở dữ liệu trong đoạn mã như thế này -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;

1
Điều này chỉ thêm văn bản như một tùy chọn trong trình đơn thả xuống. Đó không phải là những gì OP yêu cầu.
Dean Friedland

đó là về việc thêm văn bản mặc định và tôi đã làm nó theo cách này
Atiq Baqi

0
  1. Đặt nhãn lên đầu hộp kết hợp.

  2. Liên kết nội dung của nhãn với thuộc tính Văn bản kết hợp.

  3. Đặt độ mờ của hộp tổ hợp thành 0, Opacity = 0.

  4. Viết văn bản mặc định trong thuộc tính Văn bản hộp tổ hợp

          <ComboBox Name="cb"
            Text="--Select Team--" Opacity="0" 
            Height="40" Width="140" >
             <ComboBoxItem Content="Manchester United" />
             <ComboBoxItem Content="Lester" />
         </ComboBox>
     </Grid>

-2

Chỉ đặt thuộc tính IsEditable thành true

<ComboBox Name="comboBox1"            
          Text="--Select Team--"
          IsEditable="true"  <---- that's all!
          IsReadOnly="true"/>

-3

Tôi biết điều này là bán cũ nhưng những gì về cách này:

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

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />

2
ComboBoxkhông có EmptySelectionBoxTemplatetài sản.
Novitchi S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.