Изменить цвет фона кнопки через шаблон MVVM в WPF - PullRequest
14 голосов
/ 07 сентября 2011

Я использую MVVM light с WPF. Я хочу установить цвет фона кнопки на основе определенного условия через ViewModel. Пожалуйста, предложите какой-нибудь способ получить это. Спасибо

Ответы [ 2 ]

26 голосов
/ 07 сентября 2011

Вы можете привязать фон к свойству в модели представления. Хитрость заключается в том, чтобы использовать IValueConverter для возврата кисти нужного вам цвета, вот пример, который преобразует логическое значение из модели представления в цвет

public class BoolToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return new SolidColorBrush(Colors.Transparent);
        }

        return System.Convert.ToBoolean(value) ? 
            new SolidColorBrush(Colors.Red)
          : new SolidColorBrush(Colors.Transparent); 
    }

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

с выражением связывания типа

    "{Binding Reviewed, Converter={StaticResource BoolToColorConverter}}"
22 голосов
/ 07 сентября 2011

Использование триггеров:

<Button>
    <Button.Style>
        <Style TargetType="Button">
            <!-- Set the default value here (if any) 
                 if you set it directly on the button that will override the trigger -->
            <Setter Property="Background" Value="LightGreen" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeConditionalProperty}"
                             Value="True">
                    <Setter Property="Background" Value="Pink" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

[ Относительно примечания ]


В MVVM вы также можете часто обрабатывать это в модели представления через свойства только для получения, например,

public bool SomeConditionalProperty 
{
    get { /*...*/ }
    set
    {
        //...

        OnPropertyChanged("SomeConditionalProperty");
        //Because Background is dependent on this property.
        OnPropertyChanged("Background");
    }
}
public Brush Background
{
    get
    {
        return SomeConditinalProperty ? Brushes.Pink : Brushes.LightGreen;
    }
}

Тогда вы просто привязываетесь к Background.

...