你可以做到这一点使用DataGridTemplateColumn
为列B.
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ColPropertyB}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=ColPropertyB}"
IsReadOnly="{Binding Path=ColPropertyA, Converter={StaticResource IsPropertyInvalidConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
而不是使用IsReadOnly
属性,您也可以使用你想Visibility
和多个UIElements
或什么都。
第二种解决方案可以是使用CellEditingTemplateSelector
和两个CellEdititingTempates
。第一个是TextBlock
(如果ColA无效),另一个是TextBox
。 TemplateSelector
验证属性A
并返回正确的模板。
<!-- DataGrid ResourceDictionary -->
<DataTemplate x:Key="ValidTemplate">
<TextBox Text="{Binding Path=ColPropertyB}" />
</DataTemplate>
<DataTemplate x:Key="InvalidTemplate">
<TextBlock Text="{Binding Path=ColPropertyB}" />
</DataTemplate>
<ColBTemplateSelector x:Key="ColBTemplateSelector"
ValidDataTemplate="{StaticResource ValidTemplate}"
InvalidDataTemplate="{StaticResource InvalidTemplate}" />
<!-- DataGridColumns -->
<DataGridTemplateColumn CellEditingTemplateSelector="{StaticResource ColBTemplateSelector}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=RowPropertyB}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
TemplateSelector
public class ColBTemplateSelector : DataTemplateSelector
{
public DataTemplate ValidDataTemplate { get; set; }
public DataTemplate InvalidDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var tempItem = (item as YourDataItem);
if (tempItem == null || tempItem.IsColPropertyAInvalid()) return InvalidDataTemplate;
return ValidDataTemplate;
}
}
随着TemplateSelector
我不知道如果进入编辑模式时,它总是被称为...
您使用的是MVVM吗?你是否在CodeBehind中管理你的逻辑?只要列a无效,为什么不让列B只读?关于问题的问题 – lokusking