2011-02-03 57 views
6

要設置只讀ComboBox在XAML(WPF),你必須建立一個ComboBoxTextBox表示根據對性能的IsReadOnly/IsEditable必須存在於你的ViewModel只是其中之一。請注意,在此示例中,「UserNVL」必須存在於資源中,並且它應該是NameValueList集合,它允許我們將ID轉換爲名稱。在這種情況下,RecipientID是用戶名的關鍵。另請注意,VisibilityConverter也必須存在於資源中,它是標準BooleanToVisibilityConverterXAML只讀的ComboBox

天哪!這很難找到,我必須自己做。這允許用戶選擇文本框的內容。沒有辦法禁用ComboBox永遠不會允許你這樣做。

回答

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

爲什麼不直接設置IsEnabled = false?

+2

爲什麼呢?我問我的用戶同樣的問題。看起來禁用的文本框和禁用的組合框看起來如此不同,並且用戶詢問「這個灰色的東西」是不是像下面的文本框那樣,並且它非常好,更容易閱讀,並且他們可以選擇內容。 – 2011-02-03 03:12:27

0

如果的IsEnabled設置爲false,組合框的值是幾乎不可讀。我發現爲合適的解決辦法是:

  • 組合框和文本框(格式化爲只讀)處於相同的網格位置
  • 組合框跨越到下一列,以獲得額外的15的寬度,從而下拉按鈕是可見
  • 文本框.IsVisible綁定到combobox.IsEnabled與布爾到可見性轉換器。
  • textbox.Text勢必combobox.SelectedItem(在我的情況下,它是強類型的,所以我實際上綁定到它.DisplayText)
0

我認爲你會發現它更容易和實際創建類來擴展ComboBox類在此非常簡單的方式:

  1. 倍率ComboBox的OnSelectionChanged方法IsReadOnly之前檢查屬性,以允許base.OnSelectionChanged(e)中運行。

這樣你只需要將ComboBox.IsReadOnly屬性設置爲True。沒有大的XAML無處不在...