2011-02-03 12 views
6

Per impostare una sola lettura ComboBox in XAML (WPF), è necessario impostare un ComboBox e un TextBox che mostra solo uno di loro secondo un paio di proprietà IsReadOnly/IsEditable che deve esistere sul vostro ViewModel. Si noti che su questo esempio "UserNVL" deve esistere nelle risorse e dovrebbe essere una raccolta NameValueList che ci consente di convertire ID in nomi. In questo caso, RecipientID è la chiave per un nome utente. Nota anche il VisibilityConverter deve esistere anche nelle risorse ed è uno standard BooleanToVisibilityConverter.XAML ReadOnly ComboBox

Gosh! Era così difficile da trovare che dovevo farlo da solo. Ciò consente all'utente di selezionare il contenuto della casella di testo. Nessun modo per disabili ComboBox ti permetterebbe mai di farlo.

risposta

3
<DockPanel> 
    <TextBlock Text="Recipient" Margin="6,9,3,6" HorizontalAlignment="Right"/> 
    <ComboBox 
     x:Name="RecipientID" 
     ItemsSource="{Binding Source={StaticResource UserNVL}}" 
     DisplayMemberPath="Value" 
     SelectedValuePath="Key" 
     SelectedValue="{Binding Path=RecipientID}" 
     Height="20" 
     Margin="6,6,0,6" 
     MinWidth="200" 
     HorizontalAlignment="Left" 
     IsEditable ="True" 
     Visibility="{Binding Path=IsEditable, Converter={StaticResource VisibilityConverter}}"/> 
    <TextBox 
     x:Name="RecipientName" 
     Text="{Binding ElementName=RecipientID, Path=Text}" 
     Margin="6,6,0,6" 
     MinWidth="200" 
     HorizontalAlignment="Left" 
     Style="{StaticResource textBoxInError}" 
     Visibility="{Binding Path=IsReadOnly, Converter={StaticResource VisibilityConverter}}"/> 
</DockPanel> 
0

Perché non impostare semplicemente IsEnabled = false?

+2

Perché davvero? Ho chiesto ai miei utenti la stessa domanda. Sembra che le caselle di testo disattivate e le caselle combinate disattivate siano così diverse e gli utenti chiedono se "questa cosa grigia" non può essere simile alla casella di testo che si trova sotto e che è così bella e più facile da leggere e dove possono selezionare il contenuto. –

+1

Inoltre, la sola lettura dovrebbe consentire di copiare il valore. – Dave

0

Se IsEnabled è impostato su false, il valore è Combobox quasi non leggibile. Quello che ho trovato soluzione come adatto è:

  • combobox e testo (formattato come sola lettura) si trovano nella stessa posizione in griglia
  • combobox estende alla colonna successiva per ottenere ulteriori 15 larghezza tasto, così discesa è visibile
  • testo .IsVisible è associato a combobox.IsEnabled con convertitore bool to visibility.
  • TextBox.Text è destinata a combobox.SelectedItem (nel mio caso è fortemente tipizzato così ho effettivamente legato in .DisplayText di esso)
0

Penso che troverete molto più facile e pratico per creare un classe di estendere la classe ComboBox in questo modo semplice:

  1. ridefinire il metodo OnSelectionChanged del Combobox per controllare la proprietà IsReadOnly prima di consentire base.OnSelectionChanged (e) da eseguire.

In questo modo è sufficiente impostare la proprietà ComboBox.IsReadOnly su True. Nessun grande XAML da scrivere ovunque ...