更改按钮的前景色

时间:2017-03-16 15:58:13

标签: xaml mvvm

我有一个联系人列表,我想显示字母和灰色没有相应联系人的字母。

在我的模型中我有:

public class ContactInitial
{
    public string Initial { get; set; }
}

这是从数据库派生的。

在我的视图中,我有以下内容

<StackPanel Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left"  Width="17">
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">A</Button >
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">B</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">C</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">D</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">E</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">F</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">G</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">H</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">I</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">J</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">K</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">L</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">M</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">N</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">O</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">P</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">Q</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">R</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">S</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">T</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">U</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">V</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">W</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">X</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">Y</Button>
    <Button Height="17" Background="#FFFBF5A6" BorderBrush="{x:Null}">Z</Button>
</StackPanel>

如果字母不在ContactInitial中,我正在努力弄清楚如何将前景色绑定为灰色,如果不是,则为黑色。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我会用一个样式来实现它,你可以将它放到窗口的资源或容器控件中,因为样式将应用于窗口/控件中的所有按钮。

在此样式中,如果条件为真,您可以触发一个触发器。我将在多值转换器中检查的条件,该转换器应该用于绑定视图模型属性和按钮的Content属性。

这个应该有效:

   <Window.DataContext>
        <local:ViewModel ></local:ViewModel>
    </Window.DataContext>
    <Window.Resources>
        <local:ContainsStringConverter x:Key="strContConv"/>
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Gray"/>
            <Style.Triggers>
                <DataTrigger Value="true">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource strContConv}">
                            <Binding Path="InitialString"/>
                            <Binding RelativeSource="{RelativeSource Self}" Path="Content"/>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Foreground" Value="Black"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

using System;
    using System.Globalization;
    using System.Linq;
    using System.Windows.Data;
    public class ContainsStringConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values==null || values.Length<2 || !values.All(v=>v is string))
            {
                return false;
            }
            var retVal = true;
            var initalStr = values[0] as string;
            for (int i = 1; i < values.Length; i++)
            {
                retVal &= initalStr.Contains(values[i] as string);
            }
            return retVal;
        }
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

public class ViewModel : ViewModelBase
{
    public ViewModel()
    {
        _initialString = Model.Initial;
    }
    public ContactInitial Model { get; set; } = new ContactInitial { Initial = "AC" };

    public string InitialString
    {
        get
        {
            return _initialString;
        }
        set
        {
            if (value != _initialString)
            {
                _initialString = value;
                Model.Initial = _initialString;
                NotifyPropertyChanged(nameof(InitialString));
            }
        }
    }
    private string _initialString;
}