WPF背景依赖于两个参数

时间:2018-05-20 11:41:05

标签: c# wpf data-binding converter

所以我试图绑定一个控件的背景。一切正常,但根据我看到的项目的最新规格,我需要根据两个值更改背景颜色。 第二个值应该是标签的内容,它指示要使用的颜色
目前使用的转换器是电池电池(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 :(得分:0)

我建议使用MVVM-Pattern,这样可以使WPF中的所有内容更简单,更清晰:) 无论如何,这种情况会非常简单。

我实际上不在我的Dev.Pc,所以我不能给你最后的来源, 但在你的情况下,你最好使用样式触发器,如=&gt; MultiTrigger / MultidataTrigger ....

如果标签内容可用作属性,则应使用MultiDataTrigger,然后您不需要使用转换器。 - &GT;你可以简单地为每个结果使用multipleDataTriggers。

希望这个答案对你有所帮助。应该很容易谷歌如何实现这种风格的触发器。如果没有让我知道,我会在我的开发电脑上给你一些示例代码

格尔茨