Привязка к свойству DataContext внутри встроенного объявления массива - PullRequest
2 голосов
/ 23 ноября 2011

У нас есть некоторый XAML, который может показаться странным, но, по-видимому, необходим для определения пары кнопок внутри стороннего элемента управления галереей лент.У галереи есть ItemsControl.ItemsSource, который XAML заполняет двумя элементами Array, эти элементы массива являются пользовательским типом, который имеет свойство bitmap и свойство 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 есть недочеты, которые приводят к часам царапин на голове, просто ради чего-то простого.Я понимаю, что могу жестко кодировать кое-что из этого в моей модели представления, то есть создавать элементы массива в коде и привязываться к нему, но я хочу избегать этого, поскольку это будет означать, что пути кода жестко закодированы в коде, я чувствую, что пути к изображениямобъявление разметки.

Любая помощь будет высоко ценится.

Спасибо

Пол

1 Ответ

3 голосов
/ 23 ноября 2011

Вы уже использовали "канаву ElementName и использовали Source & 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}" ...

Внешний массив из-за циклической зависимости (вы можете попытаться сохранить его на месте, но я уверен, что компилятору это не понравится).

* * 1010

В качестве альтернативы вы можете извлечь 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}}">
...