如何基于相同的触发器设置数据网格的多个单元格?

时间:2014-03-02 15:59:13

标签: wpf datagrid triggers styles converter

我有一个简单的DataGrid,其中包含一列文本和一个带有复选框的列,并且基于一些相当复杂的条件,我想要设置文本样式并设置或禁用复选框。我可以为两个单元格实现相同的触发器,但这似乎是膨胀和不必要的,我正在寻找最有效的方法来做到这一点。似乎它应该是可能的,我只是完全失去了。

        <DataGrid>
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Label Name="needToStyleThis" VerticalAlignment="Center"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="" Width="Auto">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox x:Name="needToSetIsChecked"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

1 个答案:

答案 0 :(得分:0)

这通常通过数据绑定实现。如果向数据类添加bool属性,则可以在类的属性设置器中执行复杂条件。在类中,您可以轻松地更改任何其他值的任何属性值。也许是这样的:

public string Text
{
    get { return text; }
    set 
    {
        text = value;
        NotifyPropertyChanged("Text");
        IsEnabled = text == "some value" && otherSomeConditions == true;
    }
}

然后你可以将数据绑定到Checkbox.IsEnabled属性,如下所示:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Label Name="needToStyleThis" VerticalAlignment="Center"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="" Width="Auto">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsEnabled="{Binding IsEnabled}" ... />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>