访问XAML中的扩展属性

时间:2015-02-06 16:38:17

标签: c# wpf xaml

我正在为Windows 8.1编写一个应用程序,该应用程序的功能显示了一个包含在我从之前编写的API中扩展的包装类中的水平系列图像。

基本上设置如下:

我的基类A存在于我引用的外部库中。

然后,我在当前项目中包含了B类,它扩展了A但添加了WriteableBitmap属性:

public class B:A
{
    private WriteableBitmap imageBitmap;

    public WriteableBitmap ImageBitmap
    {
        get { return this.imageBitmap; }
        set
        {
            if (Equals(value, imageBitmap)) return;
            this.imageBitmap = value;
            OnPropertyChanged();
        }
    }    
}

然后我尝试使用ItemsControl中的Xaml来显示图像,其中ItemSource绑定到" ImageList"这是我的包装类的列表(在XAML文件中显然只链接到类A)。

<ItemsControl ItemsSource="{Binding ImageList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
              <Image Source = "{Binding **trying to bind to the ImageBitmap property**}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

正如您在上面所看到的,当我尝试绑定Image时,我可以访问的唯一属性是最初在基类A中声明的属性。如果我尝试以某种方式将绑定强制转换为更新的子类B,如下所示:

<Image Source = "{Binding (ex:B.ImageBitmap)}"/>

抛出错误说它的绑定无效。

作为参考,ex是我在B文件开头的项目中存在Xaml的命名空间的名称。

基本上我试图找出将绑定强制转换为您在当前项目中声明的特定类型的正确方法,该类扩展了您也引用的外部库中存在的类。

有什么想法吗?

编辑:为了提供更多关于我要做的事情的详细信息,让我再解释一下,并尝试减少不必要的细节。

我有一个外部装配,我们称之为ExternalLib。内部ExternalLib是以下类:

  • 您在上面看到的类A,它具有已在外部库中声明的各种属性。
  • 另一个名为ImagePackage的包装类,它包含以下属性:

    List<A> ImageList;

    String PackageName;

然后在我当前的项目中,我的课程B扩展了A并添加了额外的WriteableBitmap属性。

这一切都集中在我的应用中,我尝试使用嵌套ItemsControl来显示ImagePackage的垂直列表,并将其显示为PackageName作为标题。在每个垂直列表中,然后是一个水平列表,显示该列表中的每个图像(从WriteableBitmap中声明的B获得)。想象一下,想想Netflix是如何布局的(垂直和水平列表在一起)。

为实现这一目标,我使用了全局数据上下文,并且我有以下Xaml

<ItemsControl x:Name="ImageRoot" Height="861" Width="656" DataContext="{StaticResource GlobalDataContext}" ItemsSource="{Binding MainImageInfo.ImagePackages}" DisplayMemberPath="PackageName">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>    
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding ImageList}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                         <Image Source = "{Binding ImageBitmap}"/>                        
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

尝试将Image的来源声明为ImageBitmap会导致Intellisense抛出拟合,但它仍会编译并运行。问题是当绑定实际上试图更新整个应用程序崩溃时(即使我将其设置为在例外情况下中断)说:

MyAppName has exited with code -1073741189 (0xc000027b).

最后,Intellisense在该行提供的实际警告是:

Cannot resolve property "ImageBitmap" in data context of type "ExternalLib.A"

0 个答案:

没有答案