2014-09-17 2 views
0

Я разрабатываю проект WPF, и мне нужно заполнить выпадающий список со значениями, присутствующими в перечислении.Преобразование WPF в массив

Я хочу сделать это, реализовав это двойное преобразование (посмотрите на следующий код). Я смог реализовать в одном направлении, глядя на интернет-примеры, но я не мог решить обратное направление.

Моя конкретная цель поясняется моим ответом на @BenRobinson: ComboBox привязан к перечислению и к свойству, которое содержит SelectedItem и называется OpenedResultFilter. Я хочу, чтобы при изменении этого значения свойства combobox обновлял выбранный элемент. Извините за путаницу .. Я не очень опытен с WPF ..

Вы можете мне помочь?

<ComboBox 
MinWidth="80" 
ItemsSource="{Binding Converter={StaticResource EnumTypeToEnumArrayConverter}, ConverterParameter='Goldbet.GoldbetBackOffice.WPF.Model.ResultValidation.StagingOpenResultValidationFilter, Goldbet.GoldbetBackOffice.WPF.Model', Mode=OneWay}" 
SelectedItem="{Binding OpenedResultFilter, Mode=TwoWay}" 
HorizontalAlignment="Left" 
Margin="1,2,1,2" 
DockPanel.Dock="Left"/> 


<UserControl.Resources> 
     <ResourceDictionary> 

      <Converters:BoolNullableToBoolConverter x:Key="BoolNullableToBoolConverter" /> 
      <Converters:EnumTypeToEnumArrayConverter x:Key="EnumTypeToEnumArrayConverter"/> 



public class StagingResultsBatchImportViewModel : WorkspaceViewModel, IHierarchyViewModel 
    { 
private StagingOpenResultValidationFilter _openedResultFilter = StagingOpenResultValidationFilter.Tutti; 
     public StagingOpenResultValidationFilter OpenedResultFilter 
     { 
      get { return _openedResultFilter; } 
      set 
      { 
       if (_openedResultFilter != value) 
       { 
        _openedResultFilter = value; 
        OnPropertyChanged("OpenedResultFilter"); 
       } 
      } 
     } 
} 


public class EnumTypeToEnumArrayConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Type enumType = Type.GetType((string)parameter); 
     return Enum.GetValues(enumType).Cast<int>().Select(p => Enum.ToObject(enumType, p)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 
+3

Каким образом вы могли бы вернуться из коллекции в enum? Вы не можете программно добавлять значения в перечисление, оно исправлено. –

+0

Просьба поделиться xaml или кодом, где вы пытаетесь это сделать – Akanksha

+0

Это MVVM или нет? Потому что это не хороший способ заполнения ddls, если это так. –

ответ

1

Если вы не используете MVVM, как я подозреваю, что вы могли бы сделать что-то вроде этого, он отображает все значения Enum в выпадающий список с именем enumCombo в XAML:

public enum myEnum 
{ 
    One, 
    Two, 
    Four, 
    Eight 
} 

public partial class MainWindow : Window 
{ 
    private IEnumerable<string> _enumValues; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     _enumValues = ConvertEnumToStrings<myEnum>(); 

     enumCombo.ItemsSource = _enumValues; 
    } 

    private static IEnumerable<string> ConvertEnumToStrings<T>() 
    { 
     var enumValues = Enum.GetValues(typeof(T)) 
      .Cast<T>() 
      .Select(x => x.ToString()) 
      .OrderBy(x => x) 
      .ToArray(); 

     return enumValues; 
    } 
} 

Если вы делая MVVM, это преобразование enum было бы сделано в ViewModel и показано как в виде коллекции строк (например, выше), либо как ViewModel, инкапсулирующее значение (перечисления) и дружественное имя для значения перечисления, то есть пару имя-значение, которая имеет возможность удобного использования в пользовательском интерфейсе.

+1

Я не знаю, почему кто-то проголосовал за этот ответ, потому что, хотя он может быть технически не точным для автора вопроса, это еще лучшее решение, использующее 'IValueConverter'. +1 для выравнивания поля. – Sheridan

+1

Он получил downvoted, потому что OP попросил, как конвертировать BACK из строк, а не в строки. Редактировать: это был не я, я просто знаю, почему кто-то будет –

0

Извините, ребята, я много сделал, открыв этот вопрос.

Фактическая проблема была совершенно иной, поэтому, если вопрос не добавляет никакой ценности сообществу, не стесняйтесь голосовать, чтобы закрыть или удалить его.

+1

Если вы не думаете, что фактический ответ на этот вопрос будет полезен кому-то в какой-то момент в будущем, вы должны удалить вопрос. В противном случае отправьте ответ и примите его, может быть, кто-то еще найдет в нем значение. –

+0

Принято. Я думаю, что это может быть полезно, даже чтобы понять, что проблема заключается не в отсутствии конверсии. Если кто-то на моем же уровне, он может узнать что-то новое из этого ответа! – Revious