如何为ItemsControl中的每个项目显示某个路径?

时间:2014-02-11 03:26:35

标签: c# wpf xaml

所以我有一个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实例,我试图在多个地方使用它们?

我想我可以为路径数据创建一个字符串字典,为颜色添加另一个字典,并为每个字符串添加一个转换器,但这似乎仍然不太好。

有什么想法吗?

2 个答案:

答案 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>