绑定BitmapImage UriSource

时间:2015-04-19 22:35:40

标签: c# windows-phone-8 data-binding windows-store-apps windows-store

我正在尝试开发我的第一个Windows应用商店应用。 我正在使用Hub Application模板。 我想在我的HubPage的第一部分中显示来自URL的图像:

<HubSection ... >
    <DataTemplate>
        <Grid ... >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                ...
            </Grid.RowDefinitions>

            <Image Name="UserProfileImage" Margin="100, 0, 100, 0" Grid.Row="0" VerticalAlignment="Top">
                <Image.Source>
                    <BitmapImage UriSource="{Binding ImageUrl}"></BitmapImage>
                </Image.Source>
            </Image>
        </Grid>
    </DataTemplate>
</HubSection>

在我的HubPage.xaml.cs中:

[DefaultValue("http://images6.fanpop.com/image/photos/34200000/more-dumb-images-of-philip-j-fry-futurama-34257101-1440-900.png"")]
public string ImageUrl { get; set; }

但没有显示任何内容。如果我在xaml文件中手动设置图像网址,它可以正常工作......

3 个答案:

答案 0 :(得分:1)

问题是,Binding机制不知道在哪里查找ImageUrl属性。 您可以将标记的DataSource或其任何父项设置为类的实例,其中定义了属性。

或者您在每个Binding语句中使用更多信息。要绑定到自己,只需使用

UriSource="{Binding RelativeSource={RelativeSource Self}, Path=ImageUrl}"

UriSource="{Binding ImageUrl, RelativeSource={RelativeSource Self}}"

另见WPF Bind to itself

编辑:

您还需要在绑定的变量上设置通知机制。要么使其成为DependencyProperty,要么使用PropertyChanged event(通过INotifyPropertyChanged并使用属性名称调用PropertyChanged更改setter,或创建名为{的事件{1}}并在更改时调用此事件。

答案 1 :(得分:1)

不幸的是,BitmapSource.UriSource似乎无法数据绑定(或者更具体地说,它只能被绑定一次,而忽略了进一步的更改)。请参阅讨论here

答案 2 :(得分:0)

在您的代码中,您使用的是<DataTemplate>,这意味着对此的父级控制将是<ListView>或类似的内容。

您的代码很少反映您的方案。 我建议您绑定ImageSource而不是string

而是在XAML部分工作,我建议你编辑你的代码隐藏部分。

我在这里简要介绍了样本。将此与您的情况联系起来并且确实需要。

示例: -

    // BlankPage.xaml ----
    // eg. I've a listView and i want to display
    // image dynamically in DataTemplate

    <ListView x:Name="lstView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Image Source="{Binding bmp}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

现在,定义一个model课程,将itemsSource提供给ListView

// In BlankPage.xaml.cs file

public class model
{
    public ImageSource bmp { get; set; }
}

现在,比方说我在ListView事件中将itemsSource分配给Page_Loaded

    // in BlankPage.xaml.cs file
    // declare this BlankPage's Loaded event in BlankPage's Constructor
    // and define the event handler like this

    void BlankPage2_Loaded(object sender, RoutedEventArgs e)
    {
        model m1 = new model()
        {
            bmp = new BitmapImage(new Uri("ms-appx:///Assets/TechVista(300x300).png", UriKind.Absolute))
        };

    // here "ms-appx:///Assets/TechVista(300x300).png" should be the Full-System-Path where image is located.
    // and according to that declare the UriKind as Relative or Absolute or other.

        List<model> lstModels = new List<model>();
        lstModels.Add(m1);

    // you can add as many models as you want here.
    // for reference I'm adding only one here.

        lstView.ItemsSource = lstModels;
    }

它肯定会起作用。 有关更准确的答案,请在此处详细说明。

希望有帮助..!