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