Wpf 将DataGrid的第一行设为只读

Wpf 将DataGrid的第一行设为只读,wpf,datagrid,Wpf,Datagrid,我正在使用DataGrid在WPF应用程序中显示用户权限 DataGrid的第一行将始终包含显示其权限的项目的所有者 此所有者是在创建项目时设置的,不能直接从DataGrid更改 那么我的问题是 如何将第一行设置为只读,并为其指定特定样式,以便更改背景?您需要一个触发器,唯一的问题是在wpf datagrid上获取行索引非常糟糕,因此我倾向于这样做: <DataGrid.RowStyle> <Style TargetType="DataGridR

我正在使用DataGrid在WPF应用程序中显示用户权限

DataGrid的第一行将始终包含显示其权限的项目的所有者

此所有者是在创建项目时设置的,不能直接从DataGrid更改

那么我的问题是


如何将第一行设置为只读,并为其指定特定样式,以便更改背景?

您需要一个触发器,唯一的问题是在wpf datagrid上获取行索引非常糟糕,因此我倾向于这样做:

    <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsOwner}" Value="true">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>

在我知道的对象上有属性值的位置,该属性值对于该特定行是唯一的。因此,如果有一个唯一的ID或所有者一直拥有的东西,您可以绑定到该ID


setter属性为“IsEnabled”,因为datagridrow不包含只读属性,但这将阻止用户修改该行。

为此需要一个触发器,唯一的问题是在wpf datagrid上获取行索引非常糟糕,因此我倾向于这样做:

    <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsOwner}" Value="true">
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>

在我知道的对象上有属性值的位置,该属性值对于该特定行是唯一的。因此,如果有一个唯一的ID或所有者一直拥有的东西,您可以绑定到该ID


setter属性为“IsEnabled”,因为datagridrow不包含只读属性,但这将阻止用户修改该行。

以下是我的看法。上一个示例对您很好,我的示例用于演示获取细胞外观低水平控制的方法。在WPF
DataGridRow
只是一个逻辑容器中,您只能对其使用“附加”属性,例如
Enabled
FontSize
fontwweight
等,因为它们将传播到单元格级别),但实际控件的外观是在单元格级别定义的

TextBlock的只读内容通常比禁用的texbox更干净,而且您可能希望为单元格的只读和可编辑模式应用完全不同的样式,为此您必须执行与下面代码类似的操作

代码:
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows;
使用System.Windows.Controls;
使用System.Windows.Data;
使用System.Windows.Documents;
使用System.Windows.Input;
使用System.Windows.Media;
使用System.Windows.Media.Imaging;
使用System.Windows.Navigation;
使用System.Windows.Shapes;
命名空间ReadOnlyRows
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
这个。加载的+=(o,e)=>
{
this.g.ItemsSource=新列表(2)
{
new Person(){Name=“Dmitry”,Role=“Owner”},
新人(){Name=“Jody”,Role=“BA”}
};
};
}
}
公共阶层人士
{
公共字符串角色
{
收到
设置
}
公共字符串名
{
收到
设置
}
}
公共类人员服务
{
//这不应该在模板选择器中,是吗?
公共静态bool CanEdit(个人)
{
返回人.角色!=“所有者”;
}
}
公共类TemplateSelector:DataTemplateSelector
{
公共覆盖数据模板SelectTemplate(对象项,DependencyObject容器)
{
人员=项目为人员;
如果(person==null)返回null;
字符串templateName=PersonServices.CanEdit(person)?“EditableDataTemplate”:“ReadOnlyDataTemplate”;
返回(DataTemplate)((FrameworkElement)容器).FindResource(templateName);
}
}
公共类EditingTemplateSelector:DataTemplateSelector
{
公共覆盖数据模板SelectTemplate(对象项,DependencyObject容器)
{
人员=项目为人员;
如果(person==null)返回null;
字符串templateName=PersonServices.CanEdit(person)?“EditableEditingDataTemplate”:“ReadOnlyEditingDataTemplate”;
返回(DataTemplate)((FrameworkElement)容器).FindResource(templateName);
}
}
}
XAML:
以下是我的看法。上一个示例对您很好,我的示例用于演示获取细胞外观低水平控制的方法。在WPF
DataGridRow
只是一个逻辑容器中,您只能对其使用“附加”属性,例如
Enabled
FontSize
fontwweight
等,因为它们将传播到单元格级别),但实际控件的外观是在单元格级别定义的

TextBlock的只读内容通常比禁用的texbox更干净,而且您可能希望为单元格的只读和可编辑模式应用完全不同的样式,为此您必须执行与下面代码类似的操作

代码:
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.W
<Window x:Class="ReadOnlyRows.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ReadOnlyRows"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="g" AutoGenerateColumns="False"
                  CanUserAddRows="False">
            <DataGrid.Resources>
                <DataTemplate x:Key="EditableEditingDataTemplate">
                    <TextBox Text="{Binding Name}" />
                </DataTemplate>

                <DataTemplate x:Key="ReadOnlyEditingDataTemplate">
                    <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                </DataTemplate>

                <DataTemplate x:Key="EditableDataTemplate">
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>

                <DataTemplate x:Key="ReadOnlyDataTemplate">
                    <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                </DataTemplate>

                <local:TemplateSelector x:Key="TemplateSelector" />
                <local:EditingTemplateSelector x:Key="EditingTemplateSelector" />
            </DataGrid.Resources>

            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Name"
                    CellTemplateSelector="{StaticResource TemplateSelector}"
                    CellEditingTemplateSelector="{StaticResource EditingTemplateSelector}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>