Silverlight Databinding Привязка Combobox к Enum - PullRequest
0 голосов
/ 01 марта 2011

Я столкнулся с проблемой, когда несколько комбинаций, которые связаны с перечислениями в моей модели, не работают должным образом.Для начала позвольте мне сказать вам, что у меня есть 2 области моего приложения, где можно манипулировать enum.Для ясности / простоты, давайте просто скажем, что есть одинаковые виды слева и справа и результаты / сводка в центре.Когда я устанавливаю значение в одном из представлений, оно устанавливает значение с помощью ViewModel для Модели, как было спроектировано, но комбо в представлении на противоположной стороне (опять же просто для ясности / простоты), похоже, не обновилось,Он должен был выбрать соответствующую строку / элемент, но это не так.Ниже приведены фрагменты кода, который я сейчас использую:

//Definition of Enum:
public enum eNumericAndDateOperator 
{ GreaterThan, GreaterThanOrEqualTo, Equals, LessThanOrEqualTo, LessThan, Between, Ignore }


//XAML of Combo in View(s):
<ComboBox>
   <ComboBoxItem Content="" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=Ignore}" />
   <ComboBoxItem Content="&lt;" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=LessThan}" />
   <ComboBoxItem Content="&lt;=" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=LessThanOrEqualTo}" />
   <ComboBoxItem Content="=" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=Equals}" />
   <ComboBoxItem Content="&gt;=" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=GreaterThan}" />
   <ComboBoxItem Content="&gt;" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=GreaterThanOrEqualTo}" />
   <ComboBoxItem Content="Between" IsSelected="{Binding Path=SelectedOperator, Mode=TwoWay, Converter={StaticResource EnumConverter}, ConverterParameter=Between}" />
</ComboBox>

   //Enum Converter code
   public class EnumToBoolConverter : IValueConverter
   {
      #region Methods
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
         if (value == null || parameter == null)
            return value;
         return value.ToString() == parameter.ToString();
      }
      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
         if (value == null || parameter == null)
            return value;

         return Enum.Parse(targetType, parameter.ToString(), true);
      }
      #endregion Methods
   }

EnumConverter - ваш базовый класс конвертера Enum в Bool (и да с определенным ConvertBack).

Должен ли я использовать SelectedИндекс на комбо вместо?Я действительно не могу загрузить перечисление как ItemSource комбо через EnumToIEnumerableConverter или что-то еще, потому что я хочу настроить видимый текст для каждого элемента ...

1 Ответ

1 голос
/ 02 марта 2011

Почему бы вам не превратить ваше перечисление в простой класс со статическими свойствами

public class Operator
{
     public string Key { get; set; }
     public string Caption { get; set; }
     ...

    public static Operator GreaterThan { get { ... } }
    public static Operator LessThan { get { ... } }  

    public static IList<Operator> Operators { get { ... } }
}

В вашей ViewModel вы добавляете свойство Operators, которое ссылается на статическое свойство Operator.Operators

По вашему мнению:

<ComboBox ItemsSource="{Binding Operators}"
      SelectedItem="{Binding Path=SelectedOperator, Mode=TwoWay}" />

Затем создайте DataTemplate для класса Operator, который отображает заголовок.Преимущество этого подхода в том, что вы можете легко добавить новую функциональность в свой класс операторов - с помощью enum вы всегда будете ограничены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...