在DataTemplate中绑定图像源时出错

时间:2013-01-22 10:46:16

标签: c# wpf image binding

我有一张带有Canvas的ItemsControl,可以显示我的图像。我有一个ObservableCollection,其中包含一个带有propoties的类的对象:

Image Image;
double X;
double Y;

我的XAML包含以下代码:

<ItemsControl ItemsSource="{Binding Images}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas AllowDrop="True" Drop="Canvas_Drop_1" MouseDown="canvas_MouseDown_1" Background="{StaticResource LightColor}" Name="canvas" >
            </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding Image}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Canvas.Top" Value="{Binding Y}" />
            <Setter Property="Canvas.Left" Value="{Binding X}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

其中Images是我的ObservableCollection。 现在的问题是我无法将该集合中的Image绑定到ImageSource中的DataTemplate。如果我按照我的写作去做,我会收到错误:

  

System.Windows.Data错误:1:无法创建默认转换器以在类型“System.Windows.Controls.Image”和“System.Windows.Media.ImageSource”之间执行“单向”转换。考虑使用Binding的Converter属性。 BindingExpression:路径=图像; DataItem ='ImageItemViewModel'(HashCode = 7670737); target元素是'Image'(Name =''); target属性是'Source'(类型'ImageSource')

     

System.Windows.Data错误:5:BindingExpression生成的值对目标属性无效。 Value ='System.Windows.Controls.Image'BindingExpression:Path = Image; DataItem ='ImageItemViewModel'(HashCode = 7670737); target元素是'Image'(Name =''); target属性是'Source'(类型'ImageSource')

我放的时候会起作用:

<Image Source="{Binding Image.Source}"/>

而不是

<Image Source="{Binding Image}"/>

然后我失去了它拥有的所有图像属性(如效果等)。

所以问题是:我如何将我在集合对象中的整个Image对象放在那里而不仅仅绑定它的源?

1 个答案:

答案 0 :(得分:3)

您的Image媒体资源不应该是Image控件,而应该是ImageSource,或者Uristring

public class DataItem
{
    public ImageSource Image { get; set; }
    ...
}

public class DataItem
{
    public string ImageUrl { get; set; }
    ...
}

但是,如果您确实需要将该属性作为控件,则可以将其放入ContentControl中:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <ContentControl Content="{Binding Image}"/>
    </DataTemplate>
</ItemsControl.ItemTemplate>