Связывание данных WPF с проблемой RelativeSource - PullRequest
1 голос
/ 22 февраля 2011

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

Этот код является соответствующим разделом из моей разметки:

<ListBox ItemsSource="{Binding MyCollection}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding FirstName}" Height="{Binding Path=Index, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindowViewModel}}}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

('FirstName' является свойством типа Person, который является параметром типа моей коллекции. Я не добавлю код для этого класса, потому что он очень интуитивно понятен) Кодовое представление представления устанавливает DataContext для хранения ссылки и экземпляра этого класса ViewModel:

public class MainWindowViewModel : INotifyPropertyChanged
{
    int index;
    ObservableCollection<Person> myCollection;

    public ObservableCollection<Person> MyCollection
    {
        get 
        {
            if (myCollection == null)
            {
                //create the collection - not relevant for my question
            }
            return myCollection;
        }
    }
    public int Index
    {
        get
        {
            //calculate value...
        }
        set
        {
            //set the value...
        }
    }

Поскольку я связываю ItemsSource с коллекцией, мне сложно связать свойства в моей ViewModel (мне удается просто связать свойства Person ...), и мой код выдает ошибку связывания в окне вывода:

Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' SimpleMVVM.MainWindowViewModel ', AncestorLevel =' 1 ''.BindingExpression: Path = Index;DataItem = NULL;Целевым элементом является «Кнопка» (Имя = '');свойство target равно 'Height' (тип 'Double')

Может кто-нибудь помочь мне разобраться?(кстати - извините за плохой заголовок, я просто не мог найти ничего более ясного)

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Свойство Index будет находиться в ListBox DataContext, поэтому измените привязку высоты к следующему, и она должна работать

Height="{Binding Path=DataContext.Index,
                 RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>

Для ListBox

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding FirstName}"
                    Height="{Binding Path=DataContext.Index,
                                     RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>  
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
1 голос
/ 22 февраля 2011

Вам необходимо установить DataContext привязки высоты к модели представления так, как она сейчас ищет свойство индекса для отдельных элементов данных в коллекции

...