我遇到了一个小问题,任何人的建议都值得赞赏。
问题:
我在此道具的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>
答案 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>