如何根据方法提供的值格式化绑定DataGrid的单元格?

时间:2017-08-25 12:19:26

标签: c# wpf xaml datagrid formatting

我正在开发我的第一个WPF应用程序,所以我在WPF上根本没有经验丰富。我有以下情况:

我有一个DataGrid控件的窗口。窗口的构造函数接收DataTable作为输入。 Window类如下:

public partial class Project_Status_Window : Window {

        //Required for the datacontext
        public DataTable status { get; }

        public Project_Status_Window(DataTable status) {
            InitializeComponent();
            this.DataContext = this;
            this.status = status;
            this.Show();
        }
    }

为了显示表格,我在窗口的XAML描述中绑定了状态表。如下:

<DataGrid x:Name="Status_Table_Viewer" ItemsSource="{Binding status.DefaultView}"
                  AlternatingRowBackground="LightBlue" AlternationCount="1"
                  SelectionMode="Extended" SelectionUnit="Cell" ScrollViewer.CanContentScroll="True">

现在我想在一列中更改单元格的背景(最好按名称选择列)。但是,只有当单元格中的值包含在通过方法填充的列表中时,才应更改背景,而该方法又调用数据库查询。由于这是表示逻辑,我想将它保留在XAML端。我一直在研究很多,找不到类似的情况,但我相信这可以用DataTrigger来完成,所以我在XAML中有以下代码:

              <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Setter Property="FontWeight" Value="Bold" />
                    <Setter Property="TextBlock.TextAlignment" Value="Center" />
                    <Style.Triggers>
                        <DataTrigger Value="True"> I have no Idea what to write in this tag
                            <Setter Property="Background" Value="Red"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
              </DataGrid.CellStyle>

假设窗口将有一个接收字符串作为输入的方法,并返回truefalse,具体取决于数据库中是否缺少字符串。方法如下:

public bool isMissingMat(string input)

我不知道如何访问DataTable的命名列中的数据,将数据传递给我的自定义方法,然后根据DataGrid的值格式处理this.data = dataFromSomewhere(); this.dataOpt = this.data.map((d) => this.myFunction(d.id)); 的格式我的方法。

1 个答案:

答案 0 :(得分:1)

我明白你想要达到的目标。不幸的是,为DataGrid进行格式化工作非常困难,无法一步一步地向您解释。最好阅读我的文章CodeProject: Guide to WPF DataGrid formatting using bindings。它提供了很多你在MSDN上找不到的背景信息: - (

它还提供了一个示例,说明如何根据业务逻辑数据更改行的背景颜色,这正是您所需要的。

您写道:“由于这是演示逻辑,我希望将其保留在XAML端。”这不是一个好主意。 XAML擅长定义静态内容,但在执行简单的逻辑内容方面非常糟糕,比如它甚至不能执行添加或if语句或调试或...当您在代码中执行动态内容时,您的生活会变得更加容易。再次,请参阅我的文章,了解您应该在XAML中做些什么以及在后面的代码中做得更好。