所以我有一个ItemsControl,对于每个项目,我想渲染一个System.Windows.Shapes.Path来指示项目的状态。每个状态应使用不同的路径颜色。
我目前正在做什么(哪个有效,但这是一个可怕的解决方案),是为视图模型添加每个状态的属性,例如 ShowIconA , ShowIconB , ShowIconC ,以及数据模板的每个状态的路径:
<DataTemplate>
<Path Fill="Red" Visibility="{Binding ShowIconA, Converter={StaticResource BoolVisConv}}" Data="..." />
<Path Fill="Green" Visibility="{Binding ShowIconB, Converter={StaticResource BoolVisConv}}" Data="..." />
<Path Fill="Blue" Visibility="{Binding ShowIconC, Converter={StaticResource BoolVisConv}}" Data="..." />
...
</DataTemplate>
处理此问题的更好方法是什么?我想要一个状态枚举,然后在字典中查找路径或其他东西,我也想避免通过代码构建路径。
我的另一个想法是使用如下的转换器,然后我可以将Image的Source属性绑定到status属性。这种方法的问题是我找不到一个很好的方法来调整路径。我需要为每一个计算适当的相对缩放变换,或者在图像本身上设置尺寸,这只会进行位图缩放。
<conv:DictionaryConverter x:Key="StatusIcons">
<DrawingImage x:Key="Status1">
<DrawingImage.Drawing>
<GeometryDrawing Brush="Red" Geometry="...">
</DrawingImage.Drawing>
</DrawingImage>
<DrawingImage x:Key="Status2">
<DrawingImage.Drawing>
<GeometryDrawing Brush="Green" Geometry="...">
</DrawingImage.Drawing>
</DrawingImage>
</conv:DictionaryConverter>
我还尝试将Paths放入如上所述的转换器,然后在DataTemplate中绑定ContentControl,但这似乎会导致问题,因为每个状态只有一个Path实例,我试图在多个地方使用它们?
我想我可以为路径数据创建一个字符串字典,为颜色添加另一个字典,并为每个字符串添加一个转换器,但这似乎仍然不太好。
有什么想法吗?
答案 0 :(得分:1)
你可以实现如下......
<conv:StatusFillConverter x:Key="statusFillConverter"></conv:StatusFillConverter>
<conv:StatusDataConverter x:Key="statusDataConverter"></conv:StatusDataConverter >
<Path Fill="{Binding Status, Converter={StaticResource statusFillConverter}}" Data="{Binding Status, Converter={StaticResource statusDataConverter}}"></Path>
答案 1 :(得分:1)
如何在viewmodel上使用单个属性来指示要绘制的路径?
这里的诀窍在于,不是让它成为枚举,而是将它变成一个类,所以;
public class MyViewModel
{
public object PathType; //or you could have a base class/interface
...
}
public class Status1Path
{
// Don't need an implementation, just its type
}
public class Status2Path
{
// Don't need an implementation, just its type
}
现在你要做的就是为每个班级使用DataTemplate
来绘制不同的图像
<DataTemplate DataType="{x:Type Status1Path}">
<Path Fill="Red" Data="..." />
</DataTemplate>
<DataTemplate DataType="{x:Type Status2Path}">
<Path Fill="Green" Data="..." />
</DataTemplate>