Silverlight 4用户控件中的图像未设置

时间:2010-09-15 11:31:40

标签: c# silverlight-4.0

我有一个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实际上已经设置正确,但是图像的数据源在使用按钮设置之前是空的。

有没有人对为什么会这样做有任何想法?

1 个答案:

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