У меня есть таблица данных 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));
}