DataGrid.ItemSource
устанавливается в код позади до dataview
. Названия столбцов и счет нужно менять «на лету», поэтому список объектов работает не очень хорошо.Конвертер получает DataRowView вместо DataGridCell
У меня есть рабочий стол полностью работает. Что замечательно, , но мой GridCellStyle передает DataRowView в конвертер, а не DataGridCell, который я должен был передать.
Есть ли способ получить содержимое DataGridCell ИЛИ что-то, указывающее, какой столбец передан в текущий конвертер?
<UserControl x:Class="TestUI.SilveusTable"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TestUI"
mc:Ignorable="d"
>
<UserControl.Resources>
<local:CbotValueConverter x:Key="CbotValueConverter" />
<Style x:Key="GridCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="{Binding Converter={StaticResource CbotValueConverter}}"/>
</Style>
</UserControl.Resources>
<Grid>
<DataGrid x:Name="DataGrid1" IsReadOnly="True" CellStyle="{StaticResource GridCellStyle}" />
</Grid>
</UserControl>
Вот мой конвертер класса
[ValueConversion(typeof(DataGridCell), typeof(SolidColorBrush))]
public class CbotValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var dgc = (DataGridCell) value;
var rowView = (DataRowView) dgc.DataContext;
var v = rowView.Row.ItemArray[dgc.Column.DisplayIndex];
decimal amount;
if (decimal.TryParse(v.ToString(), out amount))
{
if (amount >= 10) return Brushes.Red;
if (amount >= 5) return Brushes.Blue;
if (amount > 0) return Brushes.Green;
}
return Brushes.Black; //quantity should not be below 0
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
«Это то, что я ожидал пройти». Это неправильное ожидание. Если вы явно не установили источник привязки (по источнику, RelativeSource или ElementName), Binding использует текущий DataContext в качестве своего источника. Здесь это текущий элемент из коллекции Items или ItemsSource. – Clemens
Учитывая, что стиль привязан к * DataGridCell *, а тег - * CellStyle *, ожидая, что он передаст то самое, что привязано к конвертеру, похоже, очень разумное ожидание. Как еще вы собираетесь выполнять преобразование, основанное на содержимом ячейки? –
Стиль не связан ни с чем. Свойства в установках стиля могут быть привязаны к свойствам текущего DataContext, если только Binding явно не указывает другой источник. Кроме того, содержимое ячейки не является DataGridCell. См. Здесь: [Обзор шаблонов данных] (https://msdn.microsoft.com/en-us/library/ms742521 (v = vs.110) .aspx). – Clemens