基于布尔值在Datagrid的每一行中显示图标

时间:2014-01-11 14:01:33

标签: c# wpf image datagrid

我有一个datagrid,它在运行时被绑定到一个列表。

这是它的定义,

<DataGrid Name="EmployeeContentView"
  Margin="10,10,10,10"
  RowHeight="20"
  AutoGenerateColumns="True"
  ItemsSource="{Binding}"
  Height="auto" Width="auto">
</DataGrid>

这是我将此数据网格绑定到的类,

public class Employee_Details
{
    private String eid;
    private String ename;
    private bool ispresent;

    public String eID
    {
        get { return eid; }
    }
    public String eNAME
    {
        get { return ename; }
    }
    public bool IsPRESENT
    {
        get { return ispresent; }
    }
 }

现在,我想为员工设置状态标志,无论他/她是否在场。 所以,我想根据状态标志“IsPresent”在每行的第1列显示一个图标。

这是一个类似的问题WPF DataGrid icon and boolean value。但是datagrid的完整定义是什么?

我是WPF的新手。所以,我对如何实现这一点有点困惑。 非常感谢。

1 个答案:

答案 0 :(得分:2)

您遇到了什么问题?链接的问题是非常复制/粘贴,只需稍作更改即可使用您的代码:

<DataGrid Name="EmployeeContentView"
          Margin="10,10,10,10"
          RowHeight="20"
          AutoGenerateColumns="True"    
          ItemsSource="{Binding}"          
          Height="auto" Width="auto">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Married">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image x:Name="IMG" Source="present.png" />
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=IsPRESENT}" Value="False">
                            <Setter Property="Source" Value="notpresent.png" TargetName="IMG"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

请注意,在我的情况下,我向项目添加了2张图片,present.pngnotpresent.png,并且他们的BuildAction设置为Resource

顺便说一句,如果您打算让用户从网格中更改IsPRESENT的值,您将不得不更改类定义以实现INotifyPropertyChanged,否则绑定赢了不更新,因为网格不会知道某些内容发生了变化:

public class Employee_Details : INotifyPropertyChanged
{
    private String eid;
    private String ename;
    private bool ispresent;


    public String eID
    {
        get { return eid; }
        set
        {
            if (eid == value)
                return;

            eid = value;
            this.OnPropertyChanged("eID");
        }
    }
    public String eNAME
    {
        get { return ename; }
        set
        {
            if (ename == value)
                return;

            ename = value;
            this.OnPropertyChanged("eNAME");
        }
    }
    public bool IsPRESENT
    {
        get { return ispresent; }
        set
        {
            if (ispresent == value)
                return;

            ispresent = value;
            this.OnPropertyChanged("IsPRESENT");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}