C# 从TextBlock样式设置多边形可见性
我有个小问题,任何人的建议都非常感谢 问题: 我在该道具的C# 从TextBlock样式设置多边形可见性,c#,wpf,mvvm,datatrigger,C#,Wpf,Mvvm,Datatrigger,我有个小问题,任何人的建议都非常感谢 问题: 我在该道具的RowData.Row.ScannedQty中获取我的值。我将其发送到仓库库存定义值转换器,并根据我添加的+或-检查值是否为零或正或负,但问题是设置多边形的可见性,我不能这样使用,因为Dp不可绑定。我如何实现这一点 我考虑过的解决方案: 1.使用代理文本块将值保存在那里,并在DataTrigger中使用 2.在每个多边形上调用我的转换器(这是一个选项,我想避免,因为对转换器的调用增加了4倍) 基于答案 我给converter打了三次
RowData.Row.ScannedQty
中获取我的值。我将其发送到仓库库存定义值转换器,并根据我添加的+或-检查值是否为零或正或负,但问题是设置多边形的可见性,我不能这样使用,因为Dp不可绑定。我如何实现这一点
我考虑过的解决方案:
1.使用代理文本块将值保存在那里,并在DataTrigger中使用
2.在每个多边形上调用我的转换器(这是一个选项,我想避免,因为对转换器的调用增加了4倍)
基于答案
我给converter打了三次电话,有没有更好的方法
<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>
有许多不同的方法可以解决这个问题,我通常通过模板化现有控件来实现,例如:
<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或其他东西放在希望实际文本显示在子模板中的位置。有许多不同的方法来解决这个问题,我通常通过模板化现有控件来实现,例如:
<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或其他东西放在希望实际文本显示在子模板中的位置。如果您不想创建自定义控件或用户控件
,您可以将文本块
的标记
属性设置为可见性
值,然后将多边形
的可见性
属性绑定到文本块
的标记
属性:
<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="Tag" Value="Collapsed" />
<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="Tag" Value="Visible"></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.Style>
<Style TargetType="Polygon">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility, ElementName=MinusPolygon}" Value="Visible">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Polygon.Style>
</Polygon>
<Polygon Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red"
Visibility="{Binding Tag, ElementName=TxtScannedQty}" />
<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次”,则应在视图模型的源属性中返回“零”、“加”或“减”,而不是在视图中转换值。如果不想创建自定义控件或用户控件
,您可以将文本块
的标记
属性设置为可见性
值,然后将多边形
的可见性
属性绑定到文本块
的标记
属性:
<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="Tag" Value="Collapsed" />
<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="Tag" Value="Visible"></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.Style>
<Style TargetType="Polygon">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility, ElementName=MinusPolygon}" Value="Visible">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Polygon.Style>
</Polygon>
<Polygon Name="MinusPolygon" Points="0,0 5,10, 10,0" Stroke="Red" Fill="Red"
Visibility="{Binding Tag, ElementName=TxtScannedQty}" />
<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次”,则应在视图模型中的源属性中返回“零”、“加”或“减”,而不是在视图中转换值。我添加了有问题的小brock,请查看please@AvinashReddy:不要使用转换器。看到我的答案了。我加了一个小问题,请大家看看please@AvinashReddy:不要使用转换器。看看我的答案。