繁体   English   中英

WPF DataGrid 单元格前景绑定不起作用

[英]WPF DataGrid cell foreground binding not working

我正在尝试根据其值更改列的前景色。 当我尝试静态设置前景时,它可以工作,但是当我使用转换器绑定时,什么也没有发生。

这是一个小例子

<DataGrid Foreground="White" FontSize="13" x:Name="datagrid_results" AutoGenerateColumns="False" ItemsSource="{Binding DataGridTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="3,5,1.6,35" MaxHeight="260">
    <DataGrid.Columns>
        <DataGridTextColumn IsReadOnly="True" Width="*" Header="Minimum" Binding="{Binding Minimum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <DataGridTextColumn IsReadOnly="True" Width="*" Header="Maximum" Binding="{Binding Maximum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <DataGridTextColumn IsReadOnly="True" Width="100" Header="Pass-Fail" Binding="{Binding Pass_Fail, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <Setter Property="Foreground" Value="{Binding Pass_Fail , Converter={StaticResource s2b}}" />
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

这是我的转换器:

public object Convert(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)
{
    Brush myBrush = Brushes.White;
    string input = value as string;
    switch (input)
    {
        case "Pass":
            myBrush = Brushes.LightGreen;
            break;
        case "Fail":
            myBrush = Brushes.Red;
            break;
        default:
            myBrush = Brushes.White;
            break;
    }

    return myBrush;
}

奇怪的是,在调试这个转换器时,刷子返回了正确的值。 只是单元格没有改变其文本颜色。 然而,当我使用它时: <Setter Property="Foreground" Value="Red" />我的单元格改变了它们的文本颜色。 有什么我可能会遗漏的吗?

配static颜色: 静态颜色

使用动态颜色: 动态色彩

在此处输入图像描述 >

 DataGrid Foreground="White" FontSize="13" x:Name="datagrid_results" AutoGenerateColumns="False" ItemsSource="{Binding ItemsClass, UpdateSourceTrigger=PropertyChanged}" Margin="3,5,1.6,35" MaxHeight="260"> <DataGrid.Columns> <DataGridTextColumn IsReadOnly="True" Width="*" Header="Minimum" Binding="{Binding Minimum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> <DataGridTextColumn IsReadOnly="True" Width="*" Header="Maximum" Binding="{Binding Maximum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> <DataGridTextColumn IsReadOnly="True" Width="100" Header="Pass-Fail" Binding="{Binding Pass_Fail, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="Foreground" Value="{Binding Pass_Fail, Converter={StaticResource s2b}}" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>

从 xaml 的数据网格第一行中删除 Mode=TwoWay

 public partial class MainWindow: Window { List<ItemsClass> items = new List<ItemsClass>(); public MainWindow() { InitializeComponent(); this.DataContext = this; items.Add(new ItemsClass() { Pass_Fail="Pass" }); items.Add(new ItemsClass() { Pass_Fail = "Fail" }); items.Add(new ItemsClass() { Pass_Fail = "Pass" }); items.Add(new ItemsClass() { Pass_Fail = "Fail" }); datagrid.ItemsSource = items; } }

我已经习惯了让事情正常进行,即使这不是我这样做的方式,如果你需要它快速工作,我可以为你提供一个替代方案,同时完美的解决方案即将到来。 为了使事情正常进行,我只使用了 boolean 和触发器。

         <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding pass}" Value="true">
                        <Setter Property="Background" Value="Green" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding pass}" Value="false">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
         </DataGrid.RowStyle>

所以在这个例子中(我没有修改太多),我根据传递值(它只是一个布尔值)改变了背景颜色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM