将属性绑定到CustomDataTemplate

时间:2012-07-23 11:08:51

标签: wpf xaml data-binding celltemplate

我有一个项目列表

public List<Item> MyItems { get; set; }

显示在DataGrid上。一列显示由模板定义的状态“图标”。 代码看起来像这样:

列模板[...]

<DataGridTemplateColumn Header="Status">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Grid Height="18" Width="35">
        <Rectangle Fill="{Binding Status.Background}" />
        <TextBlock Text="{Binding Status.Text}" />
      </Grid>   
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>    
</DataGridTemplateColumn>

数据模型[...]

public class Item
{
    public int ItemId { get; set; }
    public string Name { get; set; }
    public int StatusId { get; set; } 
    public Status Status { get; set; }
}
public class Status
{
    public int StatusId { get; set; }
    public int Text { get; set; }

    public Brush Background
    {
      get
      {
         //Colour logic goes here
      }
    }
}

我想从数据模型中删除颜色逻辑并将其放入资源文件中。

<DataGridTemplateColumn Header="Status" CellTemplate="{StaticResource MyCustomTemplate}" </DataGridTemplateColumn>

我希望到目前为止我正朝着正确的方向前进,但此时我迷失了,因为我不知道如何将Status属性(或StatusId)绑定到MyCustomTemplate。

如果有人能帮助我,那就太好了。

修改

这很好用。

<DataGridTemplateColumn Header="V" Width="25" IsReadOnly="True" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <ic:CloseIcon  Visibility="{Binding DockStatus, Converter={StaticResource CloseIconDisplayVisibilityConverter}}" />
                <ic:DockIcon Visibility="{Binding DockStatus, Converter={StaticResource DockIconDisplayVisibilityConverter}}" />
                <ic:UndockIcon Visibility="{Binding DockStatus, Converter={StaticResource UndockIconDisplayVisibilityConverter}}" />
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

当模型更改(DockStatus更改)时,这不会刷新UI

<DataGridTemplateColumn Header="V" Width="25" IsReadOnly="True" CellEditingTemplateSelector="{StaticResource DockIconCellTemplateSelector}}">

1 个答案:

答案 0 :(得分:1)

如果仅为特定商品或具有特定StatusId的商品选择正确的背景颜色,则可以编写binding converter。转换器只需将int转换为Brush

[ValueConversion(typeof(int), typeof(Brush))]
public class StatusColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is int)
        {
            int statusId = (int)value;
            // create Brush from id here and return it
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

您可以像这样修改Binding:

<Rectangle Fill="{Binding Status.StatusId, Converter={StaticResource StatusColorConverter}}" />