在Style中设置的Value Converter无法获取文件值,但可以获取整个数据行

时间:2018-07-31 19:01:30

标签: c# wpf xaml data-binding

我为标签设置了样式,如果基础 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MasterViewCell cell.cover.image = nil if (indexPath.row == 2 && indexPath.section == 6) || (indexPath.row == 0 && indexPath.section == 0) { cell.cover.isHidden = true } else { cell.cover.isHidden = false cell.cover.image = UIImage(named: "2.png") } } 中提交的绑定值大于零,则应触发该样式:

DataTable

标签本身是通过这种方式设置的(资源字典中的DataTemplate):

<c:Groesser0BooleanValueConverter x:Key="G0" />

<Style x:Key="DashboardProzent" TargetType="{x:Type Label}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Converter={StaticResource G0}}" Value="{x:Null}">
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>

</Style>

转换器看起来像这样:

<Label Content="{Binding percentCol}" Style="{StaticResource DashboardPrzoent}" Grid.Row="0" Grid.Column="2"/>

如果运行一整件事,我会在Groesser0BooleanValueConverter类的public class Groesser0BooleanValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (System.Convert.ToInt32(value) > 0) { return true; } else { return false; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 方法中得到错误:

  

无法将类型为'System.Data.DataRowView'的对象转换为类型   'System.IConvertible'

如果我检查Converter的Convert方法的参数,则表明已传递Convert,而不是我期望的percentCol字段的值。如何让Label传递值而不是整个行?

更新:

如果我将System.Data.DataRowView设置为

Label

该错误仍然发生。如果我禁用触发器,则会显示该值(即使没有<Label Content="{Binding Path=percentCol}" Style="{StaticResource DashboardPrzoent}" Grid.Row="0" Grid.Column="2"/> 段也是如此。

我不想在样式段中声明字段名称,因为我想将其用于其他值。

2 个答案:

答案 0 :(得分:0)

首先,我认为主要问题是由于您的Binding中的DataTrigger

<DataTrigger Binding="{Binding Converter={StaticResource G0}}" Value="{x:Null}">

这会将DataContext的直接Label传递到Converter,这显然不是您想要的。 您应该具有:

<DataTrigger  Binding="{Binding Converter={StaticResource G0}, Path=percentCol}" Value="False">

我还纠正了Value部分,因为您的“转换器”仅发送回True/False。如果您想改回Value="{x:Null}",则必须修改您的转换器。

我也建议您在Converter中更加安全,否则显式转换System.Convert.ToInt32(value)可能(将...)引发错误。

答案 1 :(得分:0)

我想将if ( $instance['show_count_in_title'] ) { printf( "<a href="me/notifications"><span class='notification-count-in-title'>(%d)</span></a>", $count ); } Binding Path设置在两个不同的位置,例如Binding ConverterDataTemplate文件。

这可以通过在Style中使用{Binding Content, RelativeSource={RelativeSource Self}, Converter={StaticResource converterName}}并像往常一样在Style中设置Binding Path

来完成。

转换器

DataTemplate

DataTemplate

<Style x:Key="DashboardPrzoent" TargetType="{x:Type Label}">
    ...
    <Style.Triggers>
        <DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}, Converter={StaticResource G0}}"  Value="True">
            <Setter Property="Foreground" Value="{StaticResource Gruen}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}, Converter={StaticResource G0}}"  Value="False">
            <Setter Property="Foreground" Value="{StaticResource Rot}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>