WPF Привязка к конкретному свойству - PullRequest
0 голосов
/ 04 июля 2010

Я новичок в DataBinding, но хотел бы выполнить следующее:

У меня есть ViewModel, в которой есть коллекция объектов: CollectionOfStuff

Каждый объект Stuff имеет некоторые свойства: Name, Value.

На мой взгляд, у меня есть StackPanel с некоторыми TextBlock с. Я хотел бы привязать свойство Text TextBlock к определенному свойству. (Я хотел бы связать с Value, когда Name из Stuff - это «какое-то имя»)

На моем StackPanel я установил DataContext для коллекции.

Однако для текстовых блоков, когда я пытаюсь ... Text="{Binding Path=Value"} ... Я получаю только первый объект в CollectionOfStuff. Как выборочно связать с Value объекта, если Name - это «какое-то имя»?

1 Ответ

3 голосов
/ 04 июля 2010

I THINK , из вашего описания вы хотите использовать ItemsControl, который по умолчанию поддерживается StackPanel.Он покажет все ваши элементы с данным шаблоном (я включил очень простой).Это выглядело бы следующим образом:

<ItemsControl ItemsSource="{Binding CollectionOfStuff}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
                <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Это то, что вы хотите сделать?Если это так, игнорируйте все остальное.

Если, однако, вы хотите привязать к определенному элементу в списке, вам нужно будет убедиться, что CollectionOfStuff внедряет индексатор this[string index](очень важный шаг).Затем вы можете вызвать его по имени:

<StackPanel DataContext="{Binding CollectionOfStuff['theName']}"></StackPanel>
    <TextBlock HorizontalAlignment="Left" Text="{Binding Name}" />
    <TextBlock HorizontalAlignment="Right" Text="{Binding Value}" />
</StackPanel>

Если вы идете по этому маршруту, но у вас нет контроля над типом коллекции, которой является CollectionOfStuff, тогда вы всегда можете создать свойсобственный индексатор на вашей ViewModel:

public object this[string indexer]
{
    get
    {
        return CollectionOfStuff.FirstOrDefault(s => s.Name == indexer);
    }
}

Тогда ваш DataContext на вашей StackPanel будет выглядеть так: DataContext="{Binding ['theName']}"

Я полагаю, все зависит от того, что именно вы пытаетесьделать.Ваше решение в этом ответе где-то:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...