WP7: привязка к элементу снаружи pivot.itemtemplate - PullRequest
1 голос
/ 21 марта 2011

Я некоторое время боролся с этим.Я немного новичок, но я много скрывался и все еще не мог найти решение своей проблемы, поэтому я решил опубликовать свой вопрос здесь.

Я привязываю сводку к коллекцииобъектов, которые я хочу отобразить, чтобы создать галерею.Вот мой сводный элемент управления, привязанный к списку с названием gallery, где каждый объект содержит 2 строки (url и description).

<controls:Pivot ItemsSource="{Binding gallery}" Grid.Row="0" x:Name="galleryPivot">
            <controls:Pivot.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>
                            <Image Source="{Binding url}" />
                            <Grid Visibility="{Binding ElementName=galleryPivot, Path=DataContext.ShowDetail}">
                                <ListBox>
                                    <ListBoxItem>
                                        <StackPanel>
                                            <TextBlock Text="{Binding description}" />
                                        </StackPanel>
                                    </ListBoxItem>
                                </ListBox>
                            </Grid>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </controls:Pivot.ItemTemplate>
        </controls:Pivot>

Datacontext является моделью представления и инициализируется в конструкторе страницы.Вот моя ViewModel:

public class GalleryViewModel : INotifyPropertyChanged
{
    public List<Gallery> gallery
    {
        get { return Globals.pictures; }

    }

    private Visibility _showDetail = Visibility.Collapsed;
    public Visibility ShowDetail
    {
        get { return _showDetail; }
        set {
           _showDetail = value;
           RaisePropertyChanged("ShowDetail");
        }
    }       
    public GalleryViewModel()
    { }

    public event PropertyChangedEventHandler PropertyChanged = delegate { return; };
    protected void RaisePropertyChanged(string propertyName)
    {
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Объект галереи представляет собой список в моей ViewModel, как свойство ShowDetail.Поскольку ShowDetail находится за пределами области действия, я попытался установить ElementName, как описано здесь .

Шарнир хорошо привязывается к списку галереи, но когда я изменяю значение ShowDetail, сетка выигралат спрятатьЯ также попытался установить ElementName в LayoutRoot, но он все равно не будет работать.

Мой вопрос, как я могу связать видимость, когда она выходит за рамки элемента шаблона?

1 Ответ

3 голосов
/ 21 марта 2011

В пределах DataTemplate привязка ElementName относится только к именам элементов, которые находятся внутри этого DataTemplate. Контекст данных в вашем шаблоне данных - это экземпляр Gallery, а не GalleryViewModel. Вместо этого вы можете переместить свойство ShowDetail в класс Gallery.

Если вы не хотите этого делать, альтернативой может быть использование прокси для контекста данных, который вы добавляете в качестве ресурса на страницу и привязываете к контексту данных страницы (предположительно, экземпляр GalleryViewModel) , Затем вы можете ссылаться на этот ресурс так же, как любой другой ресурс, чтобы получить в родительском контексте данных.

Если вы не знакомы с этой концепцией прокси, тогда Пост Дана Уолина по теме должен помочь.

...