WPF में पगेलोड पर कॉम्बो बॉक्स में डिफ़ॉल्ट पाठ "- चयन टीम -" कैसे प्रदर्शित करें?


109

एक WPF ऐप में, MVP ऐप में, मेरे पास एक कॉम्बो बॉक्स है, जिसके लिए मैं डेटाबेस से प्राप्त डेटा प्रदर्शित करता हूं। कॉम्बो बॉक्स में जोड़े गए आइटम से पहले, मैं डिफ़ॉल्ट पाठ को प्रदर्शित करना चाहता हूं जैसे कि

" -- टीम का चयन --"

ताकि पगेलोड पर यह प्रदर्शित हो और इसे चुनने पर पाठ साफ़ हो जाए और आइटम प्रदर्शित हो जाएं।

DB से डेटा का चयन हो रहा है। जब तक उपयोगकर्ता कॉम्बो बॉक्स से किसी आइटम का चयन नहीं करता, मुझे डिफ़ॉल्ट पाठ प्रदर्शित करना होगा।

कृपया मेरा मार्गदर्शन करें

जवाबों:


107

ऐसा करने का सबसे आसान तरीका है:

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

आपको स्पष्ट रूप से अपने अन्य विकल्पों को जोड़ने की आवश्यकता होगी, लेकिन यह शायद इसे करने का सबसे सरल तरीका है।

हालाँकि इस विधि में एक नकारात्मक पहलू है जो यह है कि आपके कॉम्बो बॉक्स के अंदर का पाठ संपादन योग्य नहीं होगा, फिर भी यह चयन करने योग्य है। हालाँकि, मुझे आज तक मिले हर विकल्प की खराब गुणवत्ता और जटिलता को देखते हुए, यह शायद वहाँ से बाहर सबसे अच्छा विकल्प है।


शानदार जवाब क्रिस! मैं सिर्फ Focusable = "True" जोड़ूंगा, लेकिन यह सिर्फ कॉस्मेटिक बदलाव है।
स्लाविसा

6
सही जवाब क्रिस। एक संपत्ति इतना बड़ा अंतर कर सकती है: डी
एस्टर वीगास

4
Focusable="False" IsEditable="True" IsReadOnly="True"
कामिल लेलोनेक

1
+1। Unfortunatelly यह मिश्रित वस्तुओं के साथ काम नहीं करता है (उदाहरण के लिए अगर कॉम्बोक्स आइटम चित्र हैं)।
ग्रीनोल्डमैन

11
सरल और काम कर समाधान। WPF नियंत्रणों में इस तरह की समस्याएं हैं। यहां और वहां, नियंत्रण ऐसी विशेषताएं गायब हैं जिनकी अधिकांश डेवलपर्स को आवश्यकता होगी। परिणामस्वरूप, डेवलपर्स तीसरे पक्ष के वैकल्पिक नियंत्रणों को खरीदने, या समाधानों को लागू करने के लिए अपना समय बर्बाद करते हैं ... क्या WPF टीम अपने स्वयं के विकास के लिए अपने नियंत्रण का भी उपयोग करती है?
डेमन वेजिटेबल्स

90

आप किसी का उपयोग करके पीछे किसी भी कोड के बिना ऐसा कर सकते हैं 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"

इस दृष्टिकोण के बारे में बहुत अच्छी बात यह है कि आपके कोड के पीछे कोड की पुनरावृत्ति नहीं है।


मैं इसका उपयोग करना चाहूंगा, लेकिन ऐसा लगता है कि यह उन मामलों में अनुमति नहीं है, जो कॉम्बोबॉक्स डेटाग्रिड का हेडर है। । । XAML एक त्रुटि देता है कि हेडर पहले से परिभाषित है (या शायद एक से अधिक बार परिभाषित नहीं किया जा सकता है)। कोई विचार? मैं सिर्फ एक शून्य मान विकल्प का उपयोग करने के लिए सोच रहा हूं, जो तब इसे चुनकर रीसेट की अनुमति देगा, लेकिन थोड़ा मैला लगता है।
पॉल गिब्सन

1
इसका एक बड़ा कारण यह एक उत्कृष्ट समाधान है, क्योंकि हर डेटा-बद्ध WPF प्रोजेक्ट के बारे में NullToVisibilityConverter का उपयोग होता है, इसलिए यह पहले से ही अधिकांश समय है - शायद इसका उपयोग भी कर सकता है!
तपती

2
वास्तव में आप DataTriggerयहाँ भी कनवर्टर कोड से बचने के लिए एक का उपयोग कर सकते हैं :)
बिली ओपल

49

मुझे ट्राई क्यू का उत्तर पसंद है, लेकिन उन मूल्य कन्वर्टर्स का उपयोग करने के लिए एक दर्द है। पॉल बी ने एक इवेंट हैंडलर के साथ किया, लेकिन यह भी अनावश्यक है। यहाँ एक शुद्ध 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>

33

किसी ने नहीं कहा कि शुद्ध 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>

5
मुझे डेटा ट्रिगर में "विज़िबिलिटी =" हिडन "को स्थानांतरित करने की आवश्यकता थी। तब इसने उम्मीद के मुताबिक काम किया। निश्चित रूप से मैंने देखा है कि सबसे अधिक स्ट्रैच फॉरवर्ड दृष्टिकोण है। पुनर्जीवन के लिए, मैंने शैली को एक संसाधन में बदल दिया
मिच

@ मिच IceForce का जवाब मेरे लिए काम नहीं कर रहा है, आपने इसे काम करने के लिए क्या बदल दिया?
क्रिस

1
@ मुझे लगता है कि वह <Setter Property="Visibility" Value="Hidden"/>ट्रिगर के बाहर जोड़ने का मतलब था (स्टाइल के अंदर) और Visibility="Hidden"वास्तविक टेक्स्टब्लॉक तत्व को हटाने
मोनिका को पुनः स्थापित करें कृपया

@ मिच, यदि आप DataTrigger में किसी विशिष्ट ऑब्जेक्ट (mybox) की ओर इशारा करते हुए ElementName है, तो पुन: उपयोग के लिए टेक्स्टब्लॉक शैली को संसाधन में कैसे स्थानांतरित करें? क्या उस नाम को सामान्य तरीके से निर्दिष्ट करने का कोई तरीका है?
CrApHeR

24

तत्व IsEditable="True"पर सेट करें ComboBox। यह की Textसंपत्ति को प्रदर्शित करेगा ComboBox


2
यह संपूर्ण लॉट में से सबसे सरल उपाय है।
सर्गेई कूलिकोव

6
यह बदलता है कि नियंत्रण कैसा दिखता है
simonalexander2005

16

मुझे नहीं पता कि यह सीधे समर्थित है, लेकिन आप कॉम्बो को एक लेबल के साथ ओवरले कर सकते हैं और इसे छिपा सकते हैं यदि चयन शून्य नहीं है।

जैसे।

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

1
सिलेक्शनचैन्ड हैंडलर बनाने के बजाय टेक्स्टब्लॉक की दृश्यता को XAML में सेट किया जा सकता है।
aliceraunsbaek

6

IceForge के जवाब के आधार पर मैंने एक पुन: प्रयोज्य समाधान तैयार किया:

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>

उपयोग का उदाहरण:

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

अच्छा लगा। मैंने नाम सेट करने से बचने के लिए किसी रिश्तेदार स्रोत का उपयोग करके TextBlock के DataContext को बाइंड करके इसे एक्सेप्ट किया है। मार्कअप के लिए अगली टिप्पणी देखें (एसओ की टिप्पणियों में कोड बदसूरत दिखता है)
साशा

<TextBlock DataContext = "{बाइंडिंग पाथ = चिल्ड्रन [0]। सेलेक्ट किया गया, RelativeSource = {RelativeSource AncestorType = ग्रिड}}" टेक्स्ट = "- प्रोजेक्ट चुनें -" स्टाइल = "{StaticResource ComboBoxSelectOverlay}" />
Sascha

4

कॉम्बो बॉक्स के साथ कोशिश नहीं की, लेकिन यह मेरे लिए अन्य नियंत्रण के साथ काम किया है ...

ageektrapped ब्लॉगपोस्ट

वह यहाँ वाटरमार्क प्रदर्शित करने के लिए एडोर्नर लेयर का उपयोग करता है।


बस इस कोड को डाउनलोड किया और आजमाया। यह विज्ञापन के रूप में काम करने लगता है। आपको अपने कॉम्बो को एक साधारण संलग्न संपत्ति के साथ सजाने की अनुमति देता है जिसमें आपका वॉटरमार्क होता है। यह अन्य नियंत्रणों के लिए भी काम करता है। यह इस प्रश्न के किसी भी अन्य उत्तर की तुलना में बहुत बेहतर दृष्टिकोण है।
इयान ओके

अच्छा सामान, न केवल यह कॉम्बो बॉक्स समस्या को हल करता है, लेकिन अब मैं WPF उपकरण असेंबली से छुटकारा पा सकता हूं और बस वॉटरमार्कटटेक्स्टबॉक्स नियंत्रण के बजाय मेरे टेक्स्टबॉक्स पर इसका उपयोग कर सकता हूं, इसलिए जीत से भरा :) - ओह बीडब्ल्यूटी ए गीक ट्रैप्ड नहीं ट्रैप सहमत!
dain

2

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>

2

सबसे आसान तरीका है, कम्पोजिटकॉल का उपयोग करना डिफ़ॉल्ट डेटाबेस और डेटा को सीधे कॉम्बो बॉक्स उदा में मर्ज करने के लिए

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

और संसाधन में अपने DataContext के लिए ComboBox विकल्पों को बाँधने के लिए StaticResource को परिभाषित करते हैं, क्योंकि CollectionContainer में प्रत्यक्ष बाध्यकारी सही ढंग से काम नहीं करता है।

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

इस तरह आप अपने कॉम्बो बॉक्स विकल्पों को केवल 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>

1

मैं निम्नलिखित की सिफारिश करूंगा:

एक व्यवहार को परिभाषित करें

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

यह सिंगल कॉम्बो बॉक्स के लिए एक आकर्षण की तरह काम करता है। लेकिन जब मैं इसे 1 से अधिक कॉम्बो के साथ उपयोग करता हूं, तो यह मुझे एक त्रुटि देता है (लेकिन अच्छी तरह से संकलित करता है और चलाता है) "" डिफ़ॉल्टटैक्स 'संपत्ति पहले से ही' कॉम्बो बॉक्स 'द्वारा पंजीकृत है। मैंने अपने ब्लॉग में फिक्स का उल्लेख किया है।
रोमेश डी। निरेला

इस पर ध्यान दिलाने के लिए धन्यवाद। मैं अपने कंप्यूटर पर यह त्रुटि उत्पन्न नहीं कर सका। हालाँकि, मैं मानता हूँ टाइपऑफ़ (ComboBoxBehaviors) को टाइपऑफ़ (कॉम्बोबॉक्स) के बजाय RegisterAttached के 3 पैरामीटर में पास किया जाना चाहिए।
उस्मान जफर

हालाँकि यह पोस्ट थोड़ी पुरानी है, लेकिन मैं यह नहीं देखता कि यह कैसे काम कर सकती है। कॉम्बो का bg ट्रिगर w / कई स्थितियों के माध्यम से सेट किया गया है। ग्रिड पर अकेले कॉम्बो रखने की कोशिश करें और मैन्युअल रूप से 'लाल' के लिए बीजी सेट करें। उस क्षेत्र पर इसका कोई प्रभाव नहीं पड़ता है जहाँ आप वाटरमार्क दिखाना चाहते हैं। यह केवल ड्रॉपडाउन पैनल के पीछे के बीजी को प्रभावित कर सकता है। एक बेहतर समाधान कॉम्बोक्स के नियंत्रण टेम्पलेट को कॉपी करना और सीमा के बैकग्राउंड में एक टेक्स्टब्लॉक से युक्त विज़ुअल ब्रश को पेंट करने के लिए कुछ ट्रिगर और शैलियों को जोड़ना है।
न्यूक्लियर

1

IceForge का जवाब काफी करीब था, और AFAIK इस समस्या का सबसे आसान समाधान है। लेकिन यह कुछ याद किया, क्योंकि यह काम नहीं कर रहा था (कम से कम मेरे लिए, यह वास्तव में कभी भी पाठ प्रदर्शित नहीं करता है)।

अंत में, आप केवल कॉम्बो बॉक्स के चयनित आइटम के अशक्त नहीं होने पर इसे छिपाए जाने के लिए टेक्स्टब्लॉक की "दृश्यता" गुण को "हिडन" पर सेट नहीं कर सकते हैं; आपको इसे डिफ़ॉल्ट रूप से सेट करना होगा (क्योंकि आप ट्रिगर्स में शून्य नहीं देख सकते हैं , में एक ही जगह XAML में सेटर का उपयोग करके।

यहाँ उसका वास्तविक समाधान है, लापता सेटर को ट्रिगर से ठीक पहले रखा जा रहा है:

<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

EDIT: नीचे दी गई टिप्पणियों के अनुसार, यह कोई हल नहीं है। मुझे यकीन नहीं है कि मेरे पास यह कैसे काम कर रहा था, और उस परियोजना की जांच नहीं कर सकता।

यह नवीनतम XAML के लिए इस उत्तर को अपडेट करने का समय है।

इस सवाल का हल खोजने के लिए इस SO प्रश्न को खोजने पर, मैंने तब पाया कि अपडेट किए गए XAML कल्पना का एक सरल समाधान है।

"प्लेसहोल्डर" नामक एक विशेषता अब इस कार्य को पूरा करने के लिए उपलब्ध है। यह इस तरह से सरल है (विजुअल स्टूडियो 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>

मैंने इस समाधान का उपयोग किया - क्या नकारात्मक मतदाता विस्तृत रूप से ध्यान रखता है? दी मैं एक एक्सएएमएल विशेषज्ञ नहीं हूं, लेकिन यह काम किया।
रॉब सैडलर

1
हालांकि मैं नीचे मतदाता नहीं हूं, लेकिन मुझे लगता है कि आप नीचे मतदान कर रहे थे क्योंकि वर्गPlaceholderText में कोई संपत्ति नहीं है । यह WPF के बारे में एक प्रश्न है, WinForms नहीं। System.Windows.ComboBox
शेरिदन

यार यह अजीब है - मुझे पता है कि मैं एक XAML ऐप पर काम कर रहा था, और मुझे पता है कि मैंने इसे खोज लिया था और इसे काम करते देखा था। शायद एक विस्तार परियोजना में शामिल किया गया था? IDK - मैंने तब से देखा है और सुनिश्चित किया है कि ComboBox में कोई प्लेसहोल्डर नहीं है। मैं उस परियोजना पर वापस नहीं लौट सकता जिस पर मैं काम कर रहा था - पुराने ग्राहक। ओह।
रॉब सडलर

2
आप गलत नहीं हैं, लेकिन यह WPF के लिए नहीं है। UWP ComboBox के पास यह है, कृपया इस पृष्ठ को देखें: msdn.microsoft.com/en-us/library/windows/apps/…
laishiekai

0

सबसे अच्छा अभ्यास नहीं..लेकिन ठीक काम करता है ...

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

0

मेरा मानना ​​है कि इस पोस्ट में एक वॉटरमार्क का उल्लेख किया गया है इस मामले में अच्छा काम करेगा

कोड की थोड़ी जरूरत है लेकिन आप इसे किसी भी कॉम्बोक्स या टेक्स्टबॉक्स (और यहां तक ​​कि पासवर्डबॉक्स) के लिए फिर से उपयोग कर सकते हैं इसलिए मैं इस तरह से पसंद करता हूं


0

मैं अपने प्रोजेक्ट में एक IsNullConverter क्लास का उपयोग कर रहा हूं और इसने मेरे लिए काम किया। यहाँ c # में इसके लिए कोड है, कन्वर्टर नाम का एक फ़ोल्डर बनाएँ और इस वर्ग को उस फ़ोल्डर में जोड़ें, क्योंकि उपयोग किया गया ट्रिगर नट के बजाय मान का समर्थन करता है, और 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.");
    }
}

इस तरह 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>

0

// 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");

        }
    }

0

थोड़ी देर लेकिन लेकिन ।।

एक और सरल तरीका यह होगा कि डमी डेटा आइटम को पैरामीटर IsDummy = true के साथ सूची में जोड़ें और सुनिश्चित करें कि यह HitTestVisable नहीं है और इसकी हाइट 1 पिक्सेल (एक कनवर्टर का उपयोग करके) है, इसलिए इसे नहीं देखा जाएगा।

सिर्फ़ SelectionChanged पर रजिस्टर करें और इसमें, डमी आइटम इंडेक्स पर इंडेक्स सेट करें।

यह एक आकर्षण की तरह काम करता है और इस तरह से आप कॉम्बो बॉक्स या आपके एप्लिकेशन थीम की शैली और रंगों के साथ खिलवाड़ नहीं करते हैं।


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

उपरोक्त कोड इसे प्राप्त करने का सबसे सरल तरीका प्रदर्शित करता है। विंडो लोड होने के बाद, कॉम्बोक्स के पाठ की घोषणा करें। इसे DatePicker, Textbox और अन्य नियंत्रणों तक भी बढ़ाया जा सकता है।


0

मैंने इस तरह कोडबाइंड में डेटाबेस से डेटा के साथ कॉम्बोक्स को बांधने से पहले किया था -

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

1
यह केवल पाठ को ड्रॉपडाउन में एक विकल्प के रूप में जोड़ता है। यही नहीं ओपी पूछ रहा था।
डीन फ्रीडलैंड

यह डिफ़ॉल्ट पाठ जोड़ने के बारे में है और मैंने इसे इस तरह से किया है
अतीक बाक़ी

0
  1. कॉम्बोक्स के ऊपर एक लेबल लगाएं।

  2. कॉम्बोक्स पाठ संपत्ति के लिए लेबल की सामग्री को बांधें।

  3. कॉम्बोक्स की अस्पष्टता को शून्य पर सेट करें, अपारदर्शिता = 0।

  4. कॉम्बोक्स पाठ संपत्ति में डिफ़ॉल्ट पाठ लिखें

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

-2

केवल IsEditable विशेषता को सत्य पर सेट करें

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

-3

मुझे पता है कि यह अर्ध पुराना है लेकिन इस तरह से क्या है:

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

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

2
ComboBoxEmptySelectionBoxTemplateसंपत्ति नहीं है ।
नोविचि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.