2017-03-16 120 views
2

我有一个联系人列表,我想要显示字母表并将没有对应联系人的字母灰掉。更改按钮的前景色

在我的模型,我有:

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和黑色的,如果它是。

感谢您的帮助

回答

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; 
} 
+0

嗨,特里萨,我已经修改了代码,让你有Model属性 – Rekshino

+0

谢谢你,我做了一个稍微不同的方式,以便在构造函数中,我把下列: _initialString = CurrentContact.Initials; –