我有一张带有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
对象放在那里而不仅仅绑定它的源?
答案 0 :(得分:3)
您的Image
媒体资源不应该是Image控件,而应该是ImageSource,或者Uri
或string
。
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>