Фон WPF зависит от двух параметров - PullRequest
0 голосов
/ 20 мая 2018

Итак, я пытаюсь привязать фон элемента управления.Все работает нормально, но с последними спецификациями проекта я видел, что мне нужно изменить цвет фона в зависимости от двух значений.Значение second должно быть содержимым метки , которая указывает, какой цвет использовать .
В настоящее время используется преобразователь ячейки Battery (myConverter)
Элементом для привязки является цвет фона ячейки в Gridview.Код xaml выглядит так:

<DataGrid 
    Background="Transparent" 
    ItemsSource="{Binding Source={StaticResource Properties}, Path=TableData}"
    AutoGenerateColumns="False" 
    IsReadOnly="True"
    Name="Datatable"
    VerticalScrollBarVisibility="Visible"
    BorderThickness="0"
    >
    <DataGrid.Resources>
        <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="BorderThickness" Value="0"></Setter>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
        <Style TargetType="ScrollBar">
            <Setter Property="Width" Value="15" />
            <Setter Property="BorderThickness" Value="0"></Setter>
            <Setter Property="Background" Value="Transparent"></Setter>

        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns >
        <DataGridTextColumn Width="90" Header="ID" Binding="{Binding ID}"
                            >
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground" Value="{Binding ID, Converter={StaticResource myIDConverter}}"></Setter>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Width="90" Header="Batterie" Binding="{Binding Battery}" >
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Background" Value="{Binding Battery, Converter={StaticResource myConverter}}"></Setter>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Width="90" Header="Current Use" Binding="{Binding CurrentUse}"></DataGridTextColumn>
        <DataGridTextColumn Width="90" Header="Occupancy" Binding="{Binding Occupancy}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Background" Value="{Binding Occupancy, Converter={StaticResource myConverter}}"></Setter>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Код конвертера выглядит следующим образом:

public class BatteryConverter : IValueConverter, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(String name)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush clr;
        if (int.Parse(value.ToString()) >= 80)
            clr = new SolidColorBrush(Colors.Green); 

        else if (int.Parse(value.ToString()) >= 40)
            clr = new SolidColorBrush(Colors.Orange);
        else if (int.Parse(value.ToString()) >= 0)
            clr = new SolidColorBrush(Colors.Red);
        else
            clr = new SolidColorBrush(Colors.White);

        return clr;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

1 Ответ

0 голосов
/ 21 мая 2018

Я рекомендую использовать MVVM-Pattern, который делает все проще и чище в WPF :), и этот случай будет супер легким, но в любом случае.

я на самом деле не в моем Dev.Pc, поэтому я не могу датьu конечный источник, но в вашем случае вы можете использовать триггеры стилей, такие как => MultiTrigger / MultidataTrigger ....

Если содержимое метки доступно как свойство, вам следует использовать MultiDataTrigger (s), а затемвам не нужно использовать конвертер.-> Вы можете просто использовать несколькоDataTriggers для каждого результата.

Надеюсь, этот ответ помог вам.Должно быть легко гуглить, как реализовать этот стиль триггеров.Если нет, дайте мне знать, и я дам вам пример кода, когда я нахожусь у моего разработчика ПК

greetz

...