2009-07-27 5 views
28

मान लीजिए कि हमारे पास डेटाबेस से संग्रह से डेटासोर्स बाध्य है। पाठ्यक्रम की कोई शून्य वस्तु नहीं है। शून्य आइटम को कॉम्बोबॉक्स में कैसे जोड़ें, ताकि पहले लोड उपयोगकर्ता को खाली स्ट्रिंग दिखाई दे। मैं संग्रह में एक डमी/शून्य ऑब्जेक्ट नहीं जोड़ना चाहता हूं। एक्सएएमएल में बेहतर रूप से। कोई प्रस्ताव?खाली आइटम के साथ कॉम्बोबॉक्स?

+3

सावधान रहें, कि प्रदान की समाधान बंधन के साथ काम नहीं करता। – Cartesius00

+2

मुझे बाध्यकारी समस्या के आसपास एक रास्ता मिला इस पोस्ट को देखें: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Frinavale

उत्तर

36
<ComboBox Name="myComboBox" Width="200" Background="White">  
    <ComboBox.ItemsSource>  
     <CompositeCollection> 
      <ComboBoxItem IsEnabled="False" Foreground="Black">Select Item</ComboBoxItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource DataKey}}" />  
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

संपादित

@surfen टिप्पणी में उल्लेख किया है, BindingProxy बंधन मुद्दा

+0

ठीक है अद्भुत। लेकिन पहली वस्तु को अचयनित करने के लिए कैसे? केवल डेटासोर्स आइटम का चयन किया जा सकता है। –

+2

संपादित पोस्ट देखें, आपको केवल आइटम गुणों के लिए IsEnabled = "गलत" Foreground = "Black" जोड़ने की आवश्यकता है –

+0

ठीक है क्षमा करें, मैंने उस गुण को नहीं देखा। धन्यवाद ! –

2
<UserControl.Resources> 
    <CollectionViewSource x:Key="Modules" Source="{Binding Path=Modules}" /> 
</UserControl.Resources> 

<abv:ComboBox SelectedIndex="0" IsNullable="True" 
    SelectedItem="{Binding Path=SelectedModule, Mode=TwoWay}"> 
    <abv:ComboBox.ItemsSource> 
     <CompositeCollection> 
      <ComboBoxItem Content="{DynamicResource EmptyModuleComboBox}"/> 
      <CollectionContainer Collection="{Binding Source={StaticResource Modules}}" /> 
     </CompositeCollection> 
    </abv:ComboBox.ItemsSource> 
</abv:ComboBox> 

public class ComboBox : System.Windows.Controls.ComboBox 
{ 
    public static readonly DependencyProperty IsNullableProperty = 
     DependencyProperty.Register("IsNullable", typeof(bool), typeof(ComboBox)); 

    public bool IsNullable 
    { 
     get { return (bool)GetValue(IsNullableProperty); } 
     set { SetValue(IsNullableProperty, value); } 
    } 

    public ComboBox() 
    { 
     Loaded += ComboBox_Loaded; 
    } 

    void ComboBox_Loaded(object sender, RoutedEventArgs e) 
    { 

     if (IsNullable) 
     { 
      this.ItemContainerStyle = new Style(); 

      this.ItemContainerStyle.Setters.Add(new EventSetter() 
      { 
       Event = ComboBoxItem.PreviewMouseUpEvent, 
       Handler = new MouseButtonEventHandler(cmbItem_PreviewMouseUp) 
      }); 
     } 
    } 

    public void cmbItem_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
    { 
     if (Items.IndexOf(sender as ComboBoxItem) == 0) 
     { 
      SelectedItem = null; 
     } 
    } 
} 
+1

क्या आप समझा सकते हैं कि यह क्यों काम करता है? – nikaltipar

+0

यह माउस अप ईवेंट की सदस्यता लेने के लिए काम करता है –

1

के लिए समाधान नहीं है MVVM वस्तु पर बाध्यकारी के लिए:

     <ComboBox Name="cbbFiltres" SelectedItem="{Binding ElmtInfo, Mode=TwoWay}" Height="26" MinWidth="90" SelectedIndex="0" SelectedValuePath="Id"> 
         <ComboBox.Resources> 
          <CollectionViewSource x:Key="cvsFiltres" Source="{Binding Elmts.items}"/> 
         </ComboBox.Resources> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <model:tblFiltreChamps Desc="{x:Static resx:resMain.enumAucun}" Id="0"/> 
           <CollectionContainer Collection="{Binding Source={StaticResource cvsFiltres}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 

और बाध्यकारी के लिए पर:

<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" /> 

और जेनेरिक कनवर्टर:

public class ConvNullToVisibility : IValueConverter { 
    /// <summary>Convertisseur pour le Get.</summary> 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return Visibility.Visible; // Pour annuler l'effet dans le designer: http://stackoverflow.com/questions/33401900/wpf-detect-design-mode-in-a-converter 
     return ((value == null) || (string.IsNullOrEmpty(value.ToString())) || (value.ToString() == "0")) ? Visibility.Collapsed : Visibility.Visible; 
    } 

    /// <summary>Convertisseur inverse, pour le Set (Binding).</summary> 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if (value is Visibility) { 
      return (((Visibility)value) == Visibility.Visible) ? true : false; 
     } else return false; 
    } 
} 

बस महत्वपूर्ण बता गया में SelectedValuePath घोषित करने के लिए। :-)

0

महाप्प्स combobox आज़माएं।

xmlns: नियंत्रण = "http://metro.mahapps.com/winfx/xaml/controls"

<ComboBox x:Name="bars" **controls:TextBoxHelper.ClearTextButton="True"** 
       DisplayMemberPath="Name" 
       Height="21" 
       SelectedItem="{Binding Bar}"/> 

Combo Box View