简体   繁体   English

WPF ListView对象DataTrigger

[英]WPF ListView Object DataTrigger

I'm trying to style a rectangle inside of a listview item, based on a data-field of the listview item object. 我正在尝试基于listview项目对象的数据字段在listview项目内部设置矩形的样式。

To return a boolean I'm converting the integer from daydata.workload to a boolean uasing a IValueConverter. 为了返回布尔值,我正在将整数从daydata.workload转换为使用IValueConverter的布尔值。

I'm getting no exception, the rectangle is just not affected by the DataTrigger. 我也没有例外,矩形仅不受DataTrigger的影响。 The other style rules are working fine. 其他样式规则效果很好。

<Window.Resources>
    <cv:numConverter x:Key="capacityConverter" />
<Window.Resources>

- -

<ListView Name="weekView" ItemsSource="{Binding dayList}" ItemTemplate="{StaticResource DefaultTemplate}" >
            <ListView.Resources>
                <Style TargetType="Rectangle" x:Key="capacityBG">

                    <Setter Property="Stroke" Value="#FFE2E2E2" />
                    <Setter Property="Width" Value="180" />
                    <Setter Property="Height" Value="10" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=dayList.workload, Converter={StaticResource capacityConverter}, ConverterParameter=12}">
                            <DataTrigger.Value>true</DataTrigger.Value>
                            <Setter Property="Fill" Value="Red"/>
                        </DataTrigger>

                    </Style.Triggers>
                </Style>
            </ListView.Resources>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"></StackPanel>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="Background" Value="Transparent" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListViewItem}">
                                <ContentPresenter />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>

- -

<Rectangle Style="{DynamicResource capacityBG}" VerticalAlignment="Top" Grid.Row="0" />

- -

  public class numConverter : IValueConverter
{

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((int)value) > val;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public int val { get; set; }
}

- -

public class dayData
{
    public DateTime date { get; set; }
    public int workload { get; set; }

    public List<job> jobs { get; set; }
}

The problem here is that values entered for the converter parameter and the data trigger value are treated as string. 这里的问题是,为转换器参数输入的值和数据触发值被视为字符串。 You need to specify the type for each one of these values like shown below: 您需要为以下每个值指定类型,如下所示:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

    <Style.Triggers>
            <DataTrigger>
                <DataTrigger.Binding>
                    <Binding Path="WorkLoad" Converter="{StaticResource capacityConverter}">
                        <Binding.ConverterParameter>
                            <sys:Int32>12</sys:Int32>
                        </Binding.ConverterParameter>
                    </Binding>
                </DataTrigger.Binding>
                <DataTrigger.Value>
                    <sys:Boolean>true</sys:Boolean>
                </DataTrigger.Value>
                <Setter Property="Fill" Value="Red"/>
            </DataTrigger>
    </Style.Triggers>

Then you can cast converter parameter to an int to make the comparison. 然后,您可以将转换器参数转换为int进行比较。

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value > (int)parameter;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM