gpt4 book ai didi

c# - 绑定(bind)数据网格列可见性 MVVM

转载 作者:IT王子 更新时间:2023-10-29 03:50:25 26 4
gpt4 key购买 nike

.Net 3.5

我知道列不会继承数据上下文,通过阅读其他帖子我认为这可行:

Visibility="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(FrameworkElement.DataContext).IsColumnNameVisible,
Converter={StaticResource boolToVisConverter}}"

然而当然不是..输出窗口没有提示,似乎我找到了资源,但 viewmodel 属性调用较新。

这是整个 DG:

<tk:DataGrid                                        
VirtualizingStackPanel.IsVirtualizing="False"
Grid.Column="0"
AlternationCount="2"
AreRowDetailsFrozen="True"
AutoGenerateColumns="False"
Background="Transparent"
BorderThickness="0"
CanUserAddRows="False"
CanUserReorderColumns="True"
CanUserResizeRows="False"
GridLinesVisibility="None"
ItemsSource="{Binding Employees}"
SelectionMode="Single"
ColumnHeaderStyle="{StaticResource columnHeaderStyle}"
RowHeaderStyle="{StaticResource rowHeaderStyle}"
CellStyle="{StaticResource cellStyle}"
RowStyle="{StaticResource rowStyle}"
ContextMenu="{StaticResource columnHeaderContextMenu}">
<tk:DataGrid.Resources>
<ContextMenu x:Key="columnHeaderContextMenu" ItemsSource="{Binding ColumnHeaderContextMenuItems}" />
<Style TargetType="{x:Type ScrollBar}">
<Setter Property="Background" Value="Transparent"/>
</Style>
<Style TargetType="{x:Type tk:DataGridColumnHeader}">
<Setter Property="Background" Value="Transparent"/>
</Style>
</tk:DataGrid.Resources>
<tk:DataGrid.Triggers>
<EventTrigger RoutedEvent="tk:DataGridRow.MouseDoubleClick">
<EventTrigger.Actions>
<BeginStoryboard Storyboard="{StaticResource showDetailGrid}"/>
</EventTrigger.Actions>
</EventTrigger>
</tk:DataGrid.Triggers>
<tk:DataGrid.Columns>
<tk:DataGridTextColumn IsReadOnly="True" Header="test" Binding="{Binding Name, Mode=OneWay}" Visibility="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(FrameworkElement.DataContext).IsColumnNameVisible, Converter={StaticResource boolToVisConverter}}" />
</tk:DataGrid.Columns>
</tk:DataGrid>

我几乎阅读了这个问题的每一个解决方案,但没有任何效果..

最佳答案

DataGridColumn 不是可视树的一部分,因此它们未连接到 DataGrid 的数据上下文。

要让它们连接在一起,请使用像这样的代理元素方法...

  1. 在祖先面板的 Resources 中添加代理 FrameworkElement
  2. 将其托管到绑定(bind)到其 Content 的不可见 ContentControl 中。
  3. 将此 ProxyElement 用作可见性绑定(bind)中数据上下文源的 StaticResource

    <StackPanel>
    <StackPanel.Resources>
    <local:BooleanToVisibilityConverter
    x:Key="BooleanToVisibilityConverter" />

    <FrameworkElement x:Key="ProxyElement"
    DataContext="{Binding}"/>
    </StackPanel.Resources>
    <ContentControl Visibility="Collapsed"
    Content="{StaticResource ProxyElement}"/>
    <DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
    <DataGridTextColumn
    Visibility="{Binding DataContext.IsTextColumnVisibile,
    Source={StaticResource ProxyElement},
    Converter={StaticResource
    BooleanToVisibilityConverter}}"
    Binding="{Binding Text}"/>
    </DataGrid.Columns>
    </DataGrid>
    </StackPanel>

除了 DataGridColumn 之外,上述方法还适用于将 DataContext 连接到 PopupContextMenu (即任何未连接到可视化树的元素)。

Silverlight 用户

遗憾的是,在 silverlight 中不允许使用任何框架元素设置内容控件的内容。所以解决方法是(这只是 silverlight 的指导代码)...

  1. 将框架元素资源更改为轻量级的内容,例如 Textblock。 (Silverlight 不允许指定 FrameworkElement 类型的静态资源。)

    <StackPanel.Resources>
    <TextBlock x:Key="MyTextBlock" />
  2. 编写一个附加属性以针对内容控件保存文本 block 。

    <ContentControl Visibility="Collapsed" 
    local:MyAttachedBehavior.ProxyElement="{StaticResource MyTextBlock}" />
  3. 在附加的依赖属性更改事件处理程序中,将内容控件的数据上下文设置为文本 block 的绑定(bind)。

     private static void OnProxyElementPropertyChanged(
    DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
    if (depObj is ContentControl && e.NewValue is TextBlock)
    {
    var binding = new Binding("DataContext");
    binding.Source = depObj;
    binding.Mode = OneWay;
    BindingOperations.SetBinding(
    (TextBlock)e.NewValue, TextBlock.DataContextProperty, binding);
    }
    }

因此,通过这种方式,文本 block 可能不会连接到可视化树,但可能会意识到数据上下文的变化。

希望这对您有所帮助。

关于c# - 绑定(bind)数据网格列可见性 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com