如果viewmodel中的特定标志为true,我需要更改datagridrow的背景颜色。如果该标志为false,则不管它。
在这种情况下,是否存在类似“条件绑定”的内容。
答案 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解决此问题,在绑定是特定条件时更改样式。