- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可编辑的 DataGridTemplateColumn。如果业务对象满足某些条件,我只希望用户能够编辑此列中单元格的内容。假设我的业务对象实现了 INotifyPropertyChanged 并具有三个属性:Name、Department 和 Sales。 Name 和 Department 是字符串,Sales 是 double 。
我希望只有当 Department 等于“Retail”时,用户才能编辑 Sales 值。这是我可能用来执行此操作的数据网格:
<DataGrid ItemsSource="{Binding Path=MyTypeCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=OneTime}" IsReadOnly="True" />
<DataGridTextColumn Header="Department" Binding="{Binding Path=Department, Mode=OneTime}" IsReadOnly="True" />
<DataGridTemplateColumn Header="Sales">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Sales, Mode=TwoWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsRetail}}" />
<TextBlock Text="{Binding Path=Sales, Mode=OneWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsNotRetail}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=Sales, Mode=TwoWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsRetail}}" />
<TextBlock Text="{Binding Path=Sales, Mode=OneWay}" Visibility="{Binding Path={StaticResource ResourceKey=IsNotRetail}}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我正在使用带有两个文本元素的堆栈面板。我在文本元素的可见性中使用绑定(bind)来切换文本元素。如果我有一行的 Department 值不是“Retail”,我会在 Sales 列中显示一个 TextBlock,无论该单元格是处于显示模式还是编辑模式。
这对我来说似乎是一个笨拙的解决方案。有什么方法可以阻止这些类型的单元格完全进入编辑模式吗?我只想在 Department 是“Retail”的情况下允许编辑模式。这可能吗?
编辑:添加代码。
@雷切尔。感谢您的帮助。我想粘贴我所有的数据网格 XAML 代码以确保一切正确。
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Data}">
<DataGrid.Resources>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding Path=Sales}" />
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Department" Binding="{Binding Path=Department, Mode=OneTime}" />
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name, Mode=OneTime}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentControl x:Name="salesControl">
<TextBlock Text="{Binding Sales}" />
</ContentControl>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Department}" Value="Retail">
<Setter TargetName="salesControl" Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Sales}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我几乎已经把它拿到了我想要的地方。当我单击 Retail
行中的 Sales
值时,会出现一个 TextBox 但其中没有值(请参阅 here )。我不确定为什么它没有值,因为 TextBoxTemplate 中的 TextBox 指定了一个绑定(bind)。你知道这是为什么吗?
编辑:我注意到此解决方案的另一个问题,我实际上无法编辑“销售额”列中的值。如果我尝试,该值将恢复为原始的预编辑值。
最佳答案
我会使用 DataTrigger
,它根据 Department 是否等于“Retail”来切换 TextBox.IsReadOnly
等属性的值
<Style ...>
<!-- Set Default -->
<Setter Property="IsReadOnly" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Department}" Value="Retail">
<Setter Property="IsReadOnly" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
如果您不需要在 DataGrid 中进行任何其他编辑,最简单的方法是在 DataGrid
上设置 IsReadOnly="True"
以完全禁用编辑,并且在 DataGridTemplateColumn
中的 TextBox
上设置此样式。这将摆脱很多额外的 XAML 代码,例如 IsReadOnly="True"
<DataGrid ItemsSource="{Binding Path=MyTypeCollection}"
AutoGenerateColumns="False"
IsReadOnly="True">
<!-- This could also go in Window.Resources, UserControl.Resources, etc -->
<DataGrid.Resources>
<Style x:Key="SalesTextBoxStyle" TargetType="{x:Type TextBox}">
<!-- Set Default -->
<Setter Property="IsReadOnly" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Department}" Value="Retail">
<Setter Property="IsReadOnly" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
<DataGridTextColumn Header="Department" Binding="{Binding Path=Department}" />
<DataGridTemplateColumn Header="Sales">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Sales}"
Style="{StaticResource SalesTextBoxStyle}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
如果您确实需要默认的 DataGrid 编辑功能,您仍然可以使用相同的功能,但您只需要在 中使用一个
而不是 TextBox
/TextBlock
>DataTemplateStackPanel
和多个对象。
如果您真的希望它在用户无法编辑时显示实际的 TextBlock
而不是 TextBox
,您可以使用 ContentControl
并使用 DataTrigger
ContentTemplate
属性
<DataGrid.Resources>
<DataTemplate x:Key="TextBoxTemplate">
<TextBox Text="{Binding Path=.}" />
</DataTemplate>
</DataGrid.Resources>
...
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl x:Name="salesControl" Content="{Binding Sales}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Department}" Value="Retail">
<Setter TargetName="salesControl"
Property="ContentTemplate"
Value="{StaticResource TextBoxTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
关于c# - 如何防止 DataGridTemplateColumn 根据某些条件进入编辑模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551651/
:) 我有一个 DataGrid。 Column2 中有“ComboBox1”,Column3 中有“ComboBox2”。只要“ComboBox1”的 SelectedIndex=0,我就想在“Co
我需要创建一个通用的DataGridTemplateColumn,以便可以在具有不同对象和属性的应用程序中使用它。 这是一些示例代码,我在我的项目中使用
嗨,我有一个 datagrid,它有许多 datagridtemplate 列,除了它们每个在模板的堆栈面板上都有不同的 datacontext 之外,这些列都是相同的。
我正在使用 WPF DataGrid来自 WPF 工具包。 我在我的 DataGrid 中添加了一个模板列,其中有 CheckBox在每个单元格中。现在如何访问这些单元格中的值? 我在 DataGri
我想将自定义控件添加到数据网格的模板列中。 自定义控件与文本框非常相似,但其中有一个图标。用户可以单击该图标,在提示窗口中选择一项,则所选项目将被填充到文本框中。 我的问题是当文本框被填充时,单击第二
如果 value in row = "No payment"我需要在数据模板中显示组合框,否则我不在行中显示组合框,我该怎么做? 这是我的数据网格模板:
我目前正在尝试使用 DataGridTemplateColumn 创建自定义控件这将在我们的许多应用程序中重复使用。我在获取自定义控件的依赖属性以正确绑定(bind)和引发属性更改通知时遇到了一些问题
BitmapImage im = new BitmapImage(); string path1 = @"C:\abc.png"; im.UriSource=new Uri(path1); DataG
为什么这样做...
我在 WPF 中有一个 DataGrid。在绑定(bind)到特定的 ItemsSource 后,我尝试将 Button 添加到网格的某些单元格。我尝试在 xaml 中执行此操作,如下所示:
我有一个可编辑的 DataGridTemplateColumn。如果业务对象满足某些条件,我只希望用户能够编辑此列中单元格的内容。假设我的业务对象实现了 INotifyPropertyChanged
我有一个可编辑的 DataGridTemplateColumn。如果业务对象满足某些条件,我只希望用户能够编辑此列中单元格的内容。假设我的业务对象实现了 INotifyPropertyChanged
如何访问 DataGridTemplateColumn 中的控件以获取值? 我正在使用此代码:
我正在创建一个窗口,供用户删除多个数据库寄存器,使用 DataGrid 显示数据,使用 Button 执行删除 所以我在 DataGrid 中放了一个 DataGridTemplateColumn ,
这是我的代码: foreach (var columnData in lookup.DataProvider.Metadata) { DataGridColumn column
我有这个 XAML,它从 ItemSource 是一个枚举的组合框中选择一个值。我使用的教程是: http://www.c-sharpcorner.com/uploadfile/dpatra/comb
请帮助解决这个问题,我不确定如何处理。 我有组合框和数据网格。每当我选择组合框值时,数据网格都应该加载新数据并且效果很好。但是当我选中所有带复选框的列时,我的 DataGridTemplateColu
我想改变DataGridTemplateColumn的内容样式,这里是DataGridTemplateColumn的代码:
我想在 DataGrid 中有自定义列: 但是,单击CheckBox(选中/取消选中)不会触发属性 setter
我是一名优秀的程序员,十分优秀!