Изменение цвета строки в зависимости от нескольких свойств в Silverlight - PullRequest
1 голос
/ 13 сентября 2011

У меня есть объект с 3 свойствами:

CouldBeWhite bool
CouldBeGreen bool
CouldBeRed bool

    If CouldBeWhite is true, then foreground of row should be white,  if
    CouldBeGreen is true, and CouldBeWhite is false, then row should be
    Green If CouldBeRed is true, and  and CouldBeWhite is false and
    CouldBeGreen is false then row should be Red In other case row
    should be blue.

Моя идея сейчас заключается в том, чтобы иметь новое свойство в viewmodel Color, когда я посчитал бы цвет строки.какой-нибудь более хороший способ реализовать это?

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Добавьте это перечисление в ваш проект: -

public enum RowState
{
     Blue,
     Red,
     Green,
     White
}

Затем добавьте это свойство в вашу ViewModel: -

private RowState _RowState;
public RowState RowState
{
     get { return _RowState; }
     set
     {
         if (value != _RowState)
         {
               _RowState = value;
               NotifyPropertyChanged("RowState"); // Assumes typical implementation of INotifyPropertyChanged 
         }
     }
}

private void UpdateRowState()
{
    if (CouldBeWhite)
         RowState = RowState.White;
    else if (CouldBeGreen)
         RowState = RowState.Green;
    else if (CouldBeRed)
         RowState = RowState.Red;
    else
         RowState = RowState.Blue;
}

Вызовите UpdateRowState при изменении каждого свойства CouldBeXXX.

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

Теперь идите и получите код для StringToValueConverter в этом блоге .Добавьте экземпляр этого к своему Xaml в UserControl.Resources:

         <local:StringToObjectConverter x:Key="RowStateToBrush">
             <ResourceDictionary>
                 <SolidColorBrush Color="Red" x:Key="Red" />
                 <SolidColorBrush Color="Green" x:Key="Green" />
                 <SolidColorBrush Color="White" x:Key="White" />
                 <SolidColorBrush Color="Blue" x:Key="__default__" /> 
            </ResourceDictionary>
         </local:StringToObjectConverter>

. Вы можете привязать к TextBlock:

  <TextBlock Text="{Binding SomeTextProperty}"  Foreground="{Binding RowState, Converter={StaticResource RowStateToBrush}}" />
1 голос
/ 13 сентября 2011

Вероятно, было бы понятнее реализовать эту логику в пользовательском преобразователе значений. Что-то вроде:

  public class RowColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var myObj = value as MyObjectType();

                if (myObj.CouldBeWhite)
                {
                    return new SolidColorBrush(Colors.White);
                }
                if (myObj.CouldBeGreen )
                {
                    return new SolidColorBrush(Colors.Green);
                }
                if (myObj.CouldBeRed )
                {
                    return new SolidColorBrush(Colors.Red);
                }
                return new SolidColorBrush(Colors.Blue);

            }  

           public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...