我有一个Silverlight用户控件,其中包含一个Image控件。此图像需要通过包含上述控件的另一个页面,通过绑定项目列表的数据库来设置。目前,当URL被发送到用户控件时,图像不会被设置。实际上,除SetValue(ImageSourceProperty, value);
之外的其他代码似乎没有被击中。
用户控件中的XAML如下所示:
<Grid x:Name="LayoutRoot" Background="Black">
<Image Name="ContentImage"/>
</Grid>
在后面的代码中,我将DependencyObject设置为接收图像的URL并设置图像的数据源:
public static DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ImageSource", typeof(String), typeof(MediaItemControl), null);
public String ImageSource
{
get { return (String)GetValue(ImageSourceProperty); }
set
{
SetValue(ImageSourceProperty, value);
Dispatcher.BeginInvoke(() => this.ContentImage.Source = new BitmapImage(new Uri(value, UriKind.RelativeOrAbsolute)));
}
}
MainPage.Xaml在ItemsTemplate中保存对此用户控件的引用,其中itemssource在后面的代码中设置为对象列表,该对象具有名为ImageURL的属性。此数据源在后面的代码中正确设置。这是MainPage的XAML:
<UserControl x:Class="ExampleSilverlightApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:medc="clr-namespace:ExampleSilverlightApp.Controls" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Name="ItemsControlStackPanel">
<ItemsControl Name="ContentItemControl" Visibility="Visible">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Width="126" HorizontalAlignment="Center">
<medc:MediaItemControl x:Name="CustomMediaItemControl"
ImageSource="{Binding ImageURL}"
>
</medc:MediaItemControl>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
我遇到的问题是图像源未在用户控件上设置。依赖项对象的setter似乎没有被命中。如果我在控件上放置了一个按钮,当按下该按钮时会设置ImageSource属性,然后点击该按钮并显示图像。有趣的是,ImageSource值HAS实际上已经设置正确,但是图像的数据源在使用按钮设置之前是空的。
有没有人对为什么会这样做有任何想法?
答案 0 :(得分:1)
尝试在Dependency属性的PropertyChangedCallback委托中设置ContentImage.Source - 如下所示:
public static DependencyProperty ImageSourceProperty =
DependencyProperty.Register("ImageSource", typeof(String), typeof(MediaItemControl),
new PropertyMetadata(delegate(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
(sender as MediaItemControl).ContentImage.Source = new BitmapImage(new Uri((string)args.NewValue, UriKind.RelativeOrAbsolute));
}));
当您进行数据绑定时,后台中的数据绑定引擎调用DependencyObject.SetValue(ImageSourceProperty,newValue)并且不引用实际的属性(即 - 它不调用MediaItemControl.ImageSource = newValue) - 因此逻辑在设定者不会被召唤。
HTH!