在 RowDetailsTemplate 中隐藏/折叠图像

Posted

技术标签:

【中文标题】在 RowDetailsTemplate 中隐藏/折叠图像【英文标题】:Hide/Collapse Image in RowDetailsTemplate 【发布时间】:2019-05-19 22:30:18 【问题描述】:

我有一个带有 RowDetailsTemplate 的 WPF/XAML DataGrid。选择一行后,将显示带有图像和一些文本的详细信息。 到目前为止一切顺利。

计划是根据代码中的数据使图像可见或不可见(隐藏或折叠无关紧要)。我为此绑定了一个可见性值 OrderImg。

<Window x:Class="SomeDataGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SomeDataGrid"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <DataGrid Grid.Row="1" x:Name="MydataGrid" AutoGenerateColumns="False" Margin="10" 
                  SelectionChanged="MydataGrid_SelectionChanged" 
                  SelectionMode="Single" IsReadOnly="True"
                  >
        <DataGrid.Columns>
            <DataGridTextColumn Header="ID" Binding="Binding ID"/>
            <DataGridTextColumn Header="Product" Binding="Binding PRODUCT"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <WrapPanel Background="LightBlue">
                    <Image x:Name="imgOrder" Margin="10" Width="20" Height="20" 
                               Source="/shopping_cart.png" Visibility="Binding OrderVis" />
                    <StackPanel>
                        <TextBlock Margin="5" >
                                <Run Text="Binding ID"/>
                                <Run Text="-"/>
                                <Run Text="Binding PRODUCT"/>
                        </TextBlock>
                    </StackPanel>
                </WrapPanel>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>
</Window>

MyDataGrid_SelectionChanged 将 imgOrder 值从 Visibility.Hidden 更改为 Visibility.Visible - 这在调试的消息框中也显示正常。当我在 DataGrid 之外添加另一个 Image 并将其可见性绑定到 OrderVis 时,它也会按预期对更改的选择做出反应。但在所选行的展开行详细信息中,我的图像始终可见。

我在这里做错了什么?谢谢!

PS: 简化选择更改触发器:

private void MydataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)

    Status = "";
    try
    
        if (sender != null)
        
            DataGrid grid = sender as DataGrid;
            if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
            
                DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow;
                DataRowView dr = (DataRowView)dgr.Item;
                SelectedID = dr[0].ToString();
                MySelectedIndex = dgr.GetIndex();
                if (SelectedID == "1234")
                
                    OrderVis = Visibility.Visible;
                    MessageBox.Show(SelectedID + "\r\n" + OrderVis.ToString()); //for debugging
                
                else
                
                    OrderVis = Visibility.Collapsed;
                    MessageBox.Show(SelectedID + "\r\n" + OrderVis.ToString()); //for debugging
                
            
        
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message.ToString());
    

OrderVis 更改触发器(如前所述,如果(或另一个)图像放置在 DataGrid 之外,它可以正常工作):

...

using System.Data;
using System.Configuration;
using System.ComponentModel;
using System.Runtime.CompilerServices;

...

public partial class MainWindow : INotifyPropertyChanged

    public MainWindow()
    
        DataContext = this;
        InitializeComponent();
    

...

private Visibility _ordervis;

public Visibility OrderVis

    get
    
        return _ordervis;
    
    set
    
        if (_ordervis != value)
        
            _ordervis = value;
            OnPropertyChanged();
        
    


public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string propertyName = null)

    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

【问题讨论】:

见这里:***.com/q/19708548/1136211。 RowDetailsTemplate 似乎没有使用 Window 的 DataContext。 你是我今天的英雄,非常感谢! 【参考方案1】:

感谢 Clemens 链接,解决方案是更改图像可见性绑定:

<Image Margin="10" Width="20" Height="20" 
        Visibility="Binding RelativeSource=RelativeSource AncestorType=Window,  Path=OrderVis" Source="/shopping_cart.png"/>

【讨论】:

以上是关于在 RowDetailsTemplate 中隐藏/折叠图像的主要内容,如果未能解决你的问题,请参考以下文章

无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem

WPF:DataGrid.RowDetailsTemplate:仅在选择单行时显示详细信息?

将 DataGrid.RowDetailsTemplate 的激活限制为某些列

DataGrid-RowDetailsTemplate 内的堆栈面板中的变量无法识别

RowDetailsTemplate 中的组合框在选定列之前更新所有内容

将按钮添加到 WPF DataGrid