具有二进制值的数据网格绑定

本文关键字:数据网 网格 绑定 数据 二进制 | 更新日期: 2023-09-27 18:14:58

我正在开发一个WPF数据网格自定义控件,其中我每周每天有一个Day列,每天每小时有24列,我将这些值保存在数据库中的七个不同列中(每周每一天(,这些列的数据类型为Binary(3((3字节*8位=24(,每小时1位,我的意图是以某种方式绑定网格,这样网格的每个单元格都会根据该小时的比特值将其颜色更改为红色/绿色(红色表示0,绿色表示1(,但我不知道从哪里开始。

循环不是首选,但如果没有出路,那么我也应该这样做。

请帮忙。

具有二进制值的数据网格绑定

请尝试一下,并让我知道这是否适用于您:

DailyValues可以是整数数组(每个整数包含每天的位值(。

<UserControl.Resource>
   <HourToBrushConverter x:Key="hourToBrushConverter" />
</UserControl.Resource>

<DataGrid ItemsSource="{Binding DailyValues}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="1AM" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Rectangle Fill="{Binding . 
                               Converter={StaticResource hourToBrushConverter}, 
                               ConverterParameter=1}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
<DataGridTemplateColumn Header="2AM" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Rectangle Fill="{Binding . 
                               Converter={StaticResource hourToBrushConverter}, 
                               ConverterParameter=2}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <!-- add a column for each hour (up to 24) -->
    </DataGrid.Columns>
</DataGrid>

[ValueConversion(typeof(int), typeof(Brush))]
public class HourToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int dayValue = (int)value;
        int hourNumber = (int)parameter;
        int mask = GetMask(hourNumber);
        return (dayValue & mask) > 0 ? Brushes.Green : Brushes.Red;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
    private static int GetMask(int index)
    {
       return 1 << index;
    }
}

我现在没有访问Visual Studio的权限,因此我对任何语法错误表示歉意。