WPF C # - Связывание Enum с ComboBox - PullRequest
0 голосов
/ 10 октября 2019

У меня есть выпадающий список со следующими параметрами: «HardDelete», «SoftDelete», «MoveToDeletedItems»

Я хочу, чтобы выбор по умолчанию совпадал со следующим свойством объекта EmailAction:

public DeleteMode DeleteMode { get; set; }

Вот строка кода, которую я использую, чтобы попытаться установить это:

cmboDelMode.SelectedItem = emailActionInstance.DeleteMode.ToString();

Связанный XAML:

<ComboBox x:Name="cmboDelMode" HorizontalAlignment="Left" Margin="149,218,0,0" VerticalAlignment="Top" Width="120">
    <ComboBoxItem Content="HardDelete" HorizontalAlignment="Left" Width="118"/>
    <ComboBoxItem Content="SoftDelete" HorizontalAlignment="Left" Width="118"/>
    <ComboBoxItem Content="MoveToDeletedItems" HorizontalAlignment="Left" Width="118"/>
</ComboBox>

В настоящее время комбинированный список по умолчанию пуст, поэтомуне работает, как ожидалось. Я могу использовать "emailActionInstance.DeleteMode.ToString ();"чтобы просмотреть данные в текстовом поле, возможно, я просто неправильно установил выбранный элемент?

1 Ответ

1 голос
/ 10 октября 2019

Проблема в том, что настройка ComboBox.SelectedItem не работает, если ComboBox не содержит элемент, для которого вы его устанавливаете. В вашем случае ваш ComboBox заполнен тремя объектами ComboBoxItem, для которых их свойство Content установлено в строку. Итак, ComboBox.SelectedItem является ComboBoxItem. Вы пытаетесь установить ComboBox.SelectedItem в строку, которая не будет равна ни одному из объектов, содержащихся в ComboBox. Поэтому ничего не происходит.

Я бы предложил настроить Binding для вашего ComboBox, как здесь:

<ComboBox ItemsSource="{Binding DeleteModes}" SelectedItem="{Binding SelectedDeleteMode}"  />

, а затем создать ViewModel для привязки. Если вы привяжете Enum к ComboBox, он будет отображаться правильно, поэтому вам не нужно будет вызывать DeleteMode.ToString ():

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        DeleteModes = new ObservableCollection<DeleteMode>
        { DeleteMode.HardDelete, DeleteMode.SoftDelete,
          DeleteMode.MoveToDeletedItems };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    DeleteMode _selected_delete_mode;
    public DeleteMode SelectedDeleteMode {
        get { return _selected_delete_mode; }
        set {
            _selected_delete_mode = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedDeleteMode"));
        }
    }

    ObservableCollection<DeleteMode> _delete_modes;
    public ObservableCollection<DeleteMode> DeleteModes {
        get { return _delete_modes; }
        set {
            _delete_modes = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("DeleteModes"));
        }
    }

    public void update_mode(DeleteMode mode) => SelectedDeleteMode = mode;
}
...