我有一个可编辑的DataGridTemplateColumn。如果业务对象满足某些标准,我只希望用户能够编辑此列中单元格的内容。假设我的业务对象实现INotifyPropertyChanged并具有三个属性:名称,部门和销售。 名称和部是字符串,销售是双。如何防止DataGridTemplateColumn基于某些条件进入编辑模式?
我希望用户只有在部门等于“零售”时才能够编辑销售值。这里有一个数据网格我可能会使用要做到这一点:
<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>
我使用了一个堆叠面板有两个文本元素。我在文本元素的可见性中使用绑定来切换文本元素。如果我有一个部值不是“零售”一排,我显示在销售列的单元格是否显示模式或编辑模式一个TextBlock。
这似乎是一个笨拙的解决方案给我。有什么办法可以阻止这些类型的细胞完全进入编辑模式?我只想在部门为“零售”的情况下允许编辑模式。这可能吗?
编辑:添加代码。
@Rachel。感谢您的帮助。我想粘贴所有的datagrid 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指定了一个绑定。你知道这是为什么吗?
编辑:我注意到一个其他问题该解决方案,我实际上不能编辑销售列的值。如果我尝试,该值将恢复到原始的预编辑值。
我的第三个代码块出现了一些错误。在' '行上,'Style'属性上出现''Style''类型'DataGridTemplateColumn'上找不到'的错误。如果我将该行注释掉,则在类型为'DataGridCell'的行上找不到'属性'CellTemplate''行的 '行。我错误地复制了你的代码吗? –
user2023861
2013-03-21 17:48:57
@ user2023861对不起,我写了没有编译器来仔细检查语法。看到我的更新的答案为一个有效的代码示例 – Rachel 2013-03-21 18:10:05
谢谢你看这个。我几乎有我想要的。我有一个小问题:编辑模式期间出现的TextBox最初没有使用“Sales”值加载。我想发布我的所有datagrid xaml代码,所以我对我原来的帖子进行了编辑。我的绑定有问题吗?我如何让TextBox显示'Sales'值? – user2023861 2013-03-21 19:16:47