Скрыть / свернуть изображение в RowDetailsTemplate - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица данных WPF / XAML с шаблоном RowDetailsTemplate.Когда выбрана строка, отображаются детали с изображением и текст.Пока все хорошо.

План состоит в том, чтобы изображение было видимым или невидимым (скрытое или свернутое не имеет значения) в зависимости от данных из Кодекса.Для этого я сделал привязку к значению видимости 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 и связываю его видимость с 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 Change (как уже упоминалось, он работает нормально, если (или другое) изображение размещено вне 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));
}

1 Ответ

0 голосов
/ 19 декабря 2018

благодаря ссылке Клеменса решение состояло в том, чтобы изменить привязку видимости изображения:

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