2013-03-11 5 views
4

У меня есть поле со списком WPF, которым я привязан к некоторым материалам. Пользователи должны выбрать один из элементов. Если они ничего не выбирают, я хотел бы дать предупреждение и позволить пользователю повторно выбрать.Как я могу запретить использование WPF Combobox

Как это сделать?

Я рассматриваю, что у вас есть кнопка «Выбрать». Когда пользователь ничего не выбирает, я устанавливаю:

if (combobox.SelectedItem == null) 
{ 
    MessageBox.Show("Please select one"); 

    //Here is the code to go back to selection 
} 

Существует ли универсальное решение для этого требования?

Заранее спасибо.

+2

Вместо того, чтобы дать предупреждение не позволить им это сделать в первую очередь. Если у вас есть кнопка для обработки данных, тогда отключите кнопку, если ничего не выбрано. – Paparazzi

+0

Пусть у пользователя нет возможности выбрать нуль (ничего). Заполните поле со списком и установите: combobox.SelectedIndex = 0; – Max

+0

Hi Blam, как это можно сделать? – Chelseajcole

ответ

1

Вы можете выполнить это несколькими способами, но один подход может быть:

  • связать ваш «Select» кнопки IsEnabled свойство к SelectedItem в комбинированном окне с помощью преобразователя, который выводит Правда, если SelectedItem не утратившим Ложные иначе
  • и, возможно, также определить триггер в поле со списком, чтобы отобразить предупреждение, когда SelectedItem является нулевым (использовать тот же преобразователь типа для установки триггера)

Вы можете реализовать преобразователь типа, как это:

[ValueConversion(typeof(object), typeof(bool))] 
public class NullToBoolConverter : 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) 
    { 
     return value; 
    } 
} 

Затем, вы можете использовать его как это:

<local:NullToBoolConverter x:Key="nullToBoolConverter"/> 

<Button IsEnabled="{Binding ElementName=nameOfCombobox, Path=SelectedItem, Converter={StaticResource nullToBoolConverter}}" Content="Select"/> 
4

Вы можете создать ValidationRule на ComboBoxSelectedItem,, то вы можете иметь интерфейс показать пользователю, что им нужно что-то делать.

Пример:

проверки Правило:

public class SelectionValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     return value == null 
      ? new ValidationResult(false, "Please select one") 
      : new ValidationResult(true, null); 
    } 
} 

ComboBox:

<ComboBox ItemsSource="{Binding Items}" > 
    <ComboBox.SelectedItem> 
     <Binding Path="SelectedItem"> 
      <Binding.ValidationRules> 
       <local:SelectionValidationRule ValidatesOnTargetUpdated="True"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </ComboBox.SelectedItem> 
</ComboBox> 

Это будет очертить ComboBox в красном

enter image description here

И, конечно, ite WPF, так что вы можете настроить все, чтобы вы могли добавить ControlTemplate для отказавшего Validation и добавить сообщение для проверки как ToolTip.

<Window x:Class="WpfApplication9.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication9" 
     Title="MainWindow" Height="132" Width="278" Name="UI"> 

    <Window.Resources> 

     <!--If there is a validation error, show in tooltip--> 
     <Style TargetType="ComboBox" > 
      <Style.Triggers> 
       <Trigger Property="Validation.HasError" Value="true"> 
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 

     <!--Create a template to show if validation fails--> 
     <ControlTemplate x:Key="ErrorTemplate"> 
      <DockPanel> 
       <Border BorderBrush="Red" BorderThickness="1" > 
        <AdornedElementPlaceholder/> 
       </Border> 
       <TextBlock Foreground="Red" FontSize="20" Text=" ! " /> 
      </DockPanel> 
     </ControlTemplate> 

    </Window.Resources> 

    <Grid DataContext="{Binding ElementName=UI}"> 
     <ComboBox ItemsSource="{Binding Items}" Margin="21,20,22,48" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"> 
      <ComboBox.SelectedItem> 
       <Binding Path="SelectedItem"> 
        <Binding.ValidationRules> 
         <local:SelectionValidationRule ValidatesOnTargetUpdated="True"/> 
        </Binding.ValidationRules> 
       </Binding> 
      </ComboBox.SelectedItem> 
     </ComboBox> 
    </Grid> 
</Window> 

Результат:

enter image description here

+0

Очень полезно, спасибо – Joel

Смежные вопросы