如何在特定条件下使用绑定更改背景颜色

时间:2011-03-11 20:42:00

标签: silverlight binding

如果viewmodel中的特定标志为true,我需要更改datagridrow的背景颜色。如果该标志为false,则不管它。

在这种情况下,是否存在类似“条件绑定”的内容。

4 个答案:

答案 0 :(得分:3)

您可以通过ValueConverter进行绑定:

.... BackgroundColor="{Binding BooleanFlag, Converter=BoolToColorConverter}" ....

MSDN有更多信息,但您的转换器将类似于以下伪代码:

public object Convert(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
{
    if (value is boolean)
    {
         return (value as boolean) ? Color.Red : Color.Blue;
    }
}

您不需要实现ConvertBack方法,因为它是单向绑定。

BooleanFlag更改时,您需要引发属性更改事件。

答案 1 :(得分:1)

Yeap,使用IValueConverter解决此问题的方法是正确的,我经常使用它。 但在你的情况下,我建议只使用声明方法,因为额外的转换器是解决方案中的额外抽象,并且为了理解这种逻辑,其他程序员必须忽略2个文件:声明式和转换器实现。并且将在转换器中识别将要切换的颜色:(但不在声明部分中。 要避免这种情况,请使用Blend SDK中的Microsoft.Expression.Interactions和System.Windows.Interactivity。 示例代码:

  

<网格x:名称=“LayoutRoot”背景=“白色”>

    < i:Interaction.Triggers>
        < c:DataTrigger Binding="{Binding BooleanFlagFromViewModel}" Comparison="Equal" Value="True">
            < c:ChangePropertyAction TargetName="LayoutRoot" PropertyName="Background" Value="#345678" />
        < /c:DataTrigger>
    < /i:Interaction.Triggers>
< /Grid>

希望它有所帮助!祝你好运!

<强>更新

当我写评论给AnthonyWJones以避免通过Key访问绑定资源时,我建议使用TriggerAction。

1)TriggerAction代码:

  

[ContentProperty( “结合”)]

public class ApplyBindingToDataGridRowAction : TriggerAction<DataGrid>
{

    protected override void Invoke(object parameter)
    {
        DataGridRowEventArgs e = (DataGridRowEventArgs) parameter;
        e.Row.SetBinding(DataGridRow.BackgroundProperty, Binding);
    }

    public Binding Binding { get; set; }
}

2)在XAML中使用:

  

&LT; DataGrid ...&gt;

     

&LT; I:Interaction.Triggers&GT;

    < i:EventTrigger EventName="LoadingRow">
         < a:ApplyBindingToDataGridRowAction>
              < Binding Path="Is" Converter="{StaticResource Highlighter}"/>
         < /a:ApplyBindingToDataGridRowAction>
    < /i:EventTrigger>
< /i:Interaction.Triggers>
     

&LT; /数据网格&GT;

答案 2 :(得分:1)

将布尔值转换为某种仲裁类型的两个实例之一是一个常见的要求。

就我个人而言,我认为这是这项工作的最佳工具:Generic Bool To Value Converter(但该意见可能存在偏见)

将提供的转换器的实例放在UserControl的资源中: -

 <UserControl.Resources>
     <local:BoolToBrushConverter x:Key="Highlighter" FalseValue="White" TrueValue="Yellow" />
 </UserControl.Resources>

现在,您可以将此转换器应用于绑定,将ViewModel中的布尔值绑定到类型Brush的属性。

但是,您遇到了更大的问题,如何将此转换器应用于单个数据行? DataGrid不直接允许您设置在每一行上设置的绑定。

假设您不是“视图中没有代码”,您可以使用其他静态资源执行此操作以保存简单Binding,然后使用数据网格LoadingRow事件将其应用于每个加载的行。

 <UserControl.Resources>
     <local:BoolToBrushConverter x:Key="Highlighter" FalseValue="White" TrueValue="Yellow" />
     <Binding x:Key="RowBackgroundBinding" Path="yourBoolProperty" Converter="{StaticResource Highlighter}" />
 </UserControl.Resources>

在DataGrid上: -

 <DataGrid x:Name="dg" LoadingRow="dg_LoadingRow" ...>

然后在代码隐藏中: -

    private void dg_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        e.Row.SetBinding(DataGridRow.BackgroundProperty, (Binding)Resources["RowBackgroundBinding"]);
    }     

这将在加载时在每一行上设置绑定。

答案 3 :(得分:0)

您可以使用DataTriggers解决此问题,在绑定是特定条件时更改样式。