从TextBlock样式设置多边形可见性

时间:2019-05-15 05:41:40

标签: c# wpf mvvm datatrigger

我遇到了一个小问题,任何人的建议都值得赞赏。

im trying to display something like this

问题: 我在此道具的RowData.Row.ScannedQty中获得了自己的价值。然后将其发送到此WarehouseInventoryDefineValueConvertor,并根据该值我添加了+或-来检查该值是零还是正或负,但是问题是我无法像这样设置多边形的可见性Dp无法绑定我该如何实现?

我考虑的解决方案:

1。使用代理TextBlock将值保存在那里并在DataTrigger中使用它

2。在每个多边形上调用我的转换器(这是我想避免的选项,因为对转换器的调用增加了4倍)

 <StackPanel>
        <TextBlock Grid.Row="0" Name="TxtScannedQty" Text="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" HorizontalAlignment="Right">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="{Binding ElementName=MinusPolygon,Path=Visibility}" Value="Collapsed"></Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Zero">
                            <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= {}{0}}"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Plus">
                            <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= +{}{0}}"></Setter>
                            <Setter Property="{Binding ElementName=MinusPolygon,Path=Visibility}" Value="Visble"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=TxtScannedQty,Path=Text}" Value="Minus">
                            <Setter Property="Text" Value="{Binding RowData.Row.ScannedQty, StringFormat= -{}{0}}"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
        <Grid>
            <Polygon Name="PlusPolygon"   Points="5,0 10,10, 0,10" Stroke="Green" Fill="Green" />
            <Polygon Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red" />
            <Line Name="Zero1" Stroke="Gray" X1="0" Y1="2" X2="10" Y2="2" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
            <Line Name="Zero2" Stroke="Gray" X1="0" Y1="4" X2="10" Y2="4" SnapsToDevicePixels="True" RenderOptions.EdgeMode="Aliased"   StrokeThickness="2" />
        </Grid>
    </StackPanel>

基于答案

我最终打电话给转换器3次,有没有更好的方法呢?

<Style.Triggers>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}Value="Zero">
                    <Setter Property="Template" Value="{StaticResource ZeroTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" Value="Plus">
                    <Setter Property="Template" Value="{StaticResource PositiveTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding RowData.Row.ScannedQty,Converter={UIConverter:WarehouseInventoryDefineValueConvertor}}" Value="Minus">
                    <Setter Property="Template" Value="{StaticResource NegativeTemplate}" />
                </DataTrigger>
            </Style.Triggers>

2 个答案:

答案 0 :(得分:1)

有很多不同的方法可以解决这个问题,我通常通过模板化现有控件来做到这一点,例如像这样的东西:

<Control>
    <Control.Style>
        <Style TargetType="Control">
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Zero">
                    <Setter Property="Template" Value="{StaticResource ZeroTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Plus">
                    <Setter Property="Template" Value="{StaticResource PositiveTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding SomeBoundProperty}" Value="Minus">
                    <Setter Property="Template" Value="{StaticResource NegativeTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Control.Style>
</Control>

然后在资源块中声明每个模板,但是您愿意:

<ControlTemplate x:Key="ZeroTemplate" TargetType="Control">
    <Grid>
        <!-- etc -->
    </Grid>
</ControlTemplate>

这样,视觉树中唯一的元素就是实际可见的元素。

我在这里使用了通用控件,但是您当然也可以使用TextBlock,然后将ContentPresenter或您希望实际文本显示在子模板中的地方放置

答案 1 :(得分:1)

如果您不想创建自定义控件或UserControl,则可以将Tag的{​​{1}}属性设置为TextBlock的值,然后进行绑定Visibility的{​​{1}}属性到Polygon的{​​{1}}属性:

Visibility

如果您不想“调用转换器3次”,则应从视图模型的源属性中返回“零”,“加号”或“减号”,而不是在视图中转换值。 / p>