Как привязать объект enum к фону кнопки? - PullRequest
2 голосов
/ 09 ноября 2010

Я хочу привязать цвет фона кнопки к перечислению. Интересно, существует ли объект enum, который может содержать несколько значений, например, состояние и цвет. Я хочу избежать двух перечислений, которые могут быть не синхронизированы. Вот два перечисления, которые я хотел бы интегрировать друг с другом.

enum StateValue { Player, Wall, Box }
enum StateColor { Colors.Red, Colors.Grey, Colors.Brown }

Тогда мне нужно создать привязку для кнопки XAML.

<Button Content="Player" Background="{Binding Source=...?}" />

Может быть, такой словарь полезен. Но я все еще не знаю, как нужно писать связывание.

public Dictionary<StateValue, Color> stateValueColor = 
new Dictionary<ElementState, Color>()
{
 { StateValue.Player, Colors.Red },
 { StateValue.Wall, Colors.Grey },
 { StateValue.Box, Colors.Brown }
};

Ответы [ 2 ]

6 голосов
/ 09 ноября 2010

Я бы посоветовал вам использовать для этого специальный конвертер и предоставлять перечисление только из кода (или ViewModel).

Это будет выглядеть так:

[ValueConversion(typeof(StateValue), typeof(Color))]
public class StateValueColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(!(value is StateValue))
            throw new ArgumentException("value not of type StateValue");
        StateValue sv = (StateValue)value;
        //sanity checks
        switch (sv)
            {
                case StateValue.Player:
                return Colors.Red;
                //etc
            }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
       Color c = (value as Color);
       if(c == Colors.Red)
         return StateValue.Player;
       //etc
    }
}

А в wpf:

<Button 
  Content="Player" 
  Background="{Binding Source=StateValue, 
    Converter={StaticResource stateValueColorConverter}}" />

Конечно, если вы используете DI-контейнер, вы можете предоставить различные реализации интерфейса с изменяющимися цветами, просто дайте вашему представлению получить преобразователь и добавить его через привязку к свойству converter привязки.

Примечание: этот код был написан без компилятора, я не уверен, что xaml верен на 100%, но вы должны понять это.

0 голосов
/ 15 ноября 2010

Чтобы вернуть правильный тип, нужно написать return new SolidColorBrush(Colors.Red); в StateValueColorConverter.Это решает проблему потерянного цвета фона.

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