Datagrid与二进制值绑定

时间:2011-11-18 06:02:40

标签: c# wpf mvvm datagrid

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

循环不是优先考虑的,但如果没有出路,那么我也应该继续这样做。

请帮助。

1 个答案:

答案 0 :(得分:0)

请试试这个,如果这对您有用,请告诉我:

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,所以我为任何语法错误道歉。