在内联数组声明中绑定到DataContext属性

时间:2011-11-23 15:50:42

标签: wpf arrays xaml data-binding itemscontrol

我们有一些XAML可能看起来很奇怪但显然需要在第三方的功能区图库控件中定义几个按钮。该库有一个ItemsControl.ItemsSource,XAML用两个Array项填充,这些数组项是一个自定义类型,具有位图属性和ICommand属性。一切看起来都很好但我无法将数组项属性绑定到与窗口的数据上下文有关的任何内容。我已经尝试过我所知道的每一个技巧,RelativeSource,ElementName,但无济于事。以下是XAML:

<ribbon:RibbonGallery.ItemsSource>
    <x:Array Type="{x:Type customUITypes:ClickableImage}">
        <customUITypes:ClickableImage   x:Name="BitmapAddWorkflow" Command="{Binding ElementName=MainView, Path=DataContext.MyCommandOne}">
            <customUITypes:ClickableImage.Bitmap>
                <BitmapImage UriSource="/Images/GalleryWorkflowAdd.png"/>
            </customUITypes:ClickableImage.Bitmap>
        </customUITypes:ClickableImage>
        <customUITypes:ClickableImage  x:Name="BitmapDeleteWorkflow" Command="{Binding ElementName=MainView, Path=DataContext.MyCommandTwo}">
            <customUITypes:ClickableImage.Bitmap>
                <BitmapImage UriSource="/Images/GalleryWorkflowDelete.png"/>
            </customUITypes:ClickableImage.Bitmap>
        </customUITypes:ClickableImage>                                        
    </x:Array>
</ribbon:RibbonGallery.ItemsSource>
<ribbon:RibbonGallery.ItemTemplate>
    <DataTemplate>
        <Button Command="{Binding Command}">
           <Image Margin="2" Source="{Binding Bitmap}" Stretch="None"/>
        </Button>
    </DataTemplate>
</ribbon:RibbonGallery.ItemTemplate>

注意:MainView是窗口的名称,数据上下文是我想要的100%,我对此视图上的任何其他绑定没有任何问题,只是在这个数组定义中。

我想我对于我可以访问的对象的层次结构感到困惑,但在我看来,无论我是否在数组定义标记内绑定,我仍然应该能够找到一个元素,绑定到它的数据上下文。有时XAML似乎有不一致的陷阱,这会产生数小时的头部刮伤,只是为了简单。我意识到我可以在我的View模型中对其中的一些进行硬编码,即在代码中创建我的数组项并绑定到那个但我想避免这样做,因为它意味着在代码中硬编码图像路径,我觉得图像的路径是标记声明。

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:3)

您是否使用过“沟渠ElementName并使用Source&amp; x:Reference技巧?

<Window.Resources>
    <x:Array x:Key="Items" Type="{x:Type customUITypes:ClickableImage}">
        <customUITypes:ClickableImage   x:Name="BitmapAddWorkflow"
               Command="{Binding DataContext.MyCommandOne, Source={x:Reference MainWindow}}">
            <customUITypes:ClickableImage.Bitmap>
                <BitmapImage UriSource="/Images/GalleryWorkflowAdd.png"/>
            </customUITypes:ClickableImage.Bitmap>
        </customUITypes:ClickableImage>
        <customUITypes:ClickableImage  x:Name="BitmapDeleteWorkflow"
               Command="{Binding DataContext.MyCommandTwo, Source={x:Reference MainWindow}}">
            <customUITypes:ClickableImage.Bitmap>
                <BitmapImage UriSource="/Images/GalleryWorkflowDelete.png"/>
            </customUITypes:ClickableImage.Bitmap>
        </customUITypes:ClickableImage>                                        
    </x:Array>
</Window.Resources>
<!-- ... -->
<ribbon:RibbonGallery ItemsSource="{StaticResource Items}" ...

外部化数组由于周期性依赖(你可以尝试保持原样,但我很确定编译器不会喜欢它)。


或者,您可以从管道对象中抓取DataContext:

<Window.Resources>
    <!-- Resource declaration gives you easy access using StaticResource -->
    <FrameworkElement Name="Pipe" Visibility="Hidden"/>
</Window.Resources>
<!-- Place it somewhere in the window where it can inherit the Window's DataContext -->
<StaticResource ResourceName="Pipe"/>
<!-- ... -->
<customUITypes:ClickableImage   x:Name="BitmapAddWorkflow"
    Command="{Binding DataContext.MyCommandOne, Source={StaticResource Pipe}}">