#c# #wpf #xaml
#c# #wpf #xaml
Вопрос:
Я создал инструмент для базы данных, который показывает элементы с определенными параметрами фильтрации. Однако, прочитав еще немного о WPF и C #. Я использовал это https://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings руководство по изменению моего приложения для решения ItemCollectionViewSource
Я пытаюсь применить определенный фон к разным строкам. Я создал класс:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
namespace Liinos_inspector_FilterTest
{
class LiinosIDToBackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
{
string LiinosID = "";
if (LiinosID.Trim().StartsWith("7")) return Brushes.Blue;
if (LiinosID.Trim().StartsWith("6")) return Brushes.Yellow;
}
return Brushes.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Вот часть XAML:
<DataGrid Margin="0,146,0,0" Background="{x:Null}" BorderBrush="{x:Null}"
CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" IsReadOnly="True"
HorizontalGridLinesBrush="#FF377A6C" VerticalGridLinesBrush="#FF377A6C"
DataContext="{StaticResource ItemCollectionViewSource}"
ItemsSource="{Binding}"
AutoGenerateColumns="False" FontFamily="Arial Nova" Foreground="White" >
<!--RowBackground="Transparent"-->
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" >
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Item.YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />
</Style>
</DataGrid.RowStyle>
Вот XAML для столбцов:
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding YRNRO}">
<DataGridTextColumn.Header>
<TextBlock Text="LIINOS ID" FontWeight="Bold" TextAlignment="Left"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding HAKUNIMI}">
<DataGridTextColumn.Header>
<TextBlock Text="SEARCH NAME" FontWeight="Bold" TextAlignment="Left"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
В настоящее время все строки красные, так как похоже, что это не так if (value is string)
. У кого-нибудь есть предложения, как это можно исправить?
Комментарии:
1. Вы уже проверили в режиме отладки, какое значение передается? Можете ли вы поделиться этим?
Ответ №1:
Проблема, или, во всяком случае, одна из них, заключается в вашей привязке. Когда вы делаете:
Value="{Binding RelativeSource={RelativeSource Self}, Path=Item.YRNRO,
Он ищет элемент свойства в DataGridRow, у которого есть свойство YRNRO.
Более вероятно, что вы захотите привязаться к чему-то, что является datacontext datagridrow, что означает, что вы должны удалить привязку relativesource.
У вас есть коллекция чего-то, что является источником collectionviewsource. Каждая строка в datagrid получает что-то в виде datacontext.
В зависимости от того, что именно это такое, вы должны использовать:
<Setter Property="Background" Value="{Binding YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />
Или, если что-то имеет свойство под названием Item, которое является сложным объектом с proprty YNRNO, тогда
<Setter Property="Background" Value="{Binding Item.YRNRO, Converter={StaticResource LiinosIDToBackgroundConverter}}" />
Комментарии:
1. Спасибо вам за это! Вторая проблема заключалась в преобразователе «значение», который мне пришлось использовать
if (value.ToString().Trim().StartsWith("7")) return Brushes.Blue;
вместо того, что было раньше `