先定义一个数据代理:
public class BindingProxy : Freezable
{
protected override Freezable CreateInstanceCore() => new BindingProxy();
public object Data
{
get => GetValue(DataProperty);
set => SetValue(DataProperty, value);
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}
Xaml中的写法:
<DataGrid x:Name="gridList" ItemsSource="{Binding ListDataSource}" CanUserSortColumns="False"
Height="{Binding ActualHeight, ElementName=mCanvas}"
CanUserAddRows="False" AutoGenerateColumns="False" HeadersVisibility="Column">
<DataGrid.Resources>
<ulitiy:BindingProxy x:Key="DataContextProxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Data.IsListViewMode, Source={StaticResource DataContextProxy}, Converter={StaticResource boolToVisibleCvt}}"
Binding="{Binding CreateByName}" Width="130" IsReadOnly="True" Header="创建人" ElementStyle="{StaticResource MaterialDesignDataGridTextColumnStyle}"/>
<DataGridTemplateColumn Width="auto">
<DataGridTemplateColumn.Header>
<TextBlock Text="操作" TextAlignment="Center"/>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button HorizontalAlignment="Left" Visibility="{Binding Data.IsListViewMode, Source={StaticResource DataContextProxy}, Converter={StaticResource boolToVisibleCvt}}" Style="{StaticResource MaterialDesignFlatButton}"
Command="{Binding DataContext.DeleteCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" CommandParameter="{Binding .}">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="DeleteOutline" Width="26" Height="26" Margin="0 0 5 0"/>
<TextBlock Text="删除" VerticalAlignment="Center" FontSize="16px"/>
</StackPanel>
</Button>
<Button HorizontalAlignment="Left" Visibility="{Binding DataContext.IsListViewMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Converter={StaticResource boolToVisibleCvt}, ConverterParameter=true}"
Style="{StaticResource MaterialDesignFlatButton}" Command="{Binding DataContext.DeleteCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" CommandParameter="{Binding .}">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Kind="CheckBold" Foreground="Green" Width="26" Height="26" Margin="0 0 5 0"/>
<TextBlock Text="确认选择" Foreground="Green" VerticalAlignment="Center" FontSize="16px"/>
</StackPanel>
</Button>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
如上所示:模板列里内容的显示和隐藏 有一个写法绑定到父亲UserControl的 DataContext 的 IsListViewMode属性,但同样的写法应用到 第一列不会生效。此时使用数据代理的模式则可正常显示或隐藏。
百度得来分析原因:DataGridTextColumn不在Virsual Tree中,不能继承UserControl的DataContext,而模板列渲染后存在于可视化树结构中(为何可以使用数据代理呢?暂时未知原因)。