Как вы привязываетесь к элементу списка?

У меня есть ListBox на странице, которая использует следующий шаблон данных, определенный в Resource раздел контроля.

<mvvm:ViewObject.Resources>
    <DataTemplate DataType="{x:Type discovery:FabricTierMetadata}">
        <fabricman:FabricManInstanceItem Metadata="{Binding}"/>
    </DataTemplate>
</mvvm:ViewObject.Resources>

Я хочу связать текущий элемент списка, но вместо этого происходит следующее: Metadata={Binding} является привязкой к модели представления элемента управления (вместо элемента в списке). Как мне написать так, чтобы он связывал элемент списка, а не текущую модель представления?

<mvvm:ViewObject.Resources>
    <fabricman:MyConverter x:Key="Converter" />
        <DataTemplate DataType="{x:Type discovery:FabricTierMetadata}">
            <fabricman:FabricManInstanceItem Metadata="{Binding Converter={StaticResource Converter}}"/>
        </DataTemplate>
</mvvm:ViewObject.Resources>

<Grid>
    <TabControl TabStripPlacement="Bottom">
        <TabItem Header="Clouds">
            <ListBox Background="Transparent" ItemsSource="{Binding AvailableClouds}" HorizontalContentAlignment="Stretch" />
        </TabItem>
    </TabControl>
</Grid>

Я добавил конвертер для целей отладки (чтобы я мог видеть, что было отправлено через).

Исходный код фона:

internal class FabricServiceManagerVM : ViewModelBase<FabricServiceManagerVM>
{
    public ViewModelCollection<FabricTierMetadata> AvailableClouds { get; private set; }

    public FabricServiceManagerVM()
    {
        this.AvailableClouds = new ViewModelCollection<FabricTierMetadata>();
        FabricServicingModel.ServiceManagerSetChanged += FabricServicingModel_ServiceManagerSetChanged;
    }

    void FabricServicingModel_ServiceManagerSetChanged(object sender, Model.Events.FabricServicingEndpointsChangedEventArgs args)
    {
        ServiceDiscoveryMetadata metadata = args.Metadatas.First();
        this.AvailableClouds.Add(new FabricTierMetadata(metadata.Name, metadata.Address)); 
    }
}

ViewModelCollection<T> по сути дела усилен ObservableCollection,

ListBox показывает правильное количество элементов в моем AvailableClouds коллекция, которая является правильной.... но когда дело доходит до применения DataTemplate он отправляет не тот товар, хотя. Должен быть отправка экземпляра FabricTierMetadata но вместо этого отправляет через модель представления.

Обновление:

Когда я делаю это:

            <ListBox Background="Transparent" 
                     ItemsSource="{Binding AvailableClouds}" HorizontalContentAlignment="Stretch" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Name}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Это показывает Name собственность просто отлично? Тем не менее, когда я говорю просто {Binding} в одиночку я получаю ВМ.

2 ответа

Решение

Это должно сделать это. Дайте шаблону ключ и назначьте его как StaticResource к ItemsPanelTemplate имущество.

<mvvm:ViewObject.Resources>
    <fabricman:MyConverter x:Key="Converter" />
    <DataTemplate x:Key="FabricTierItem" DataType="{x:Type discovery:FabricTierMetadata}">
        <fabricman:FabricManInstanceItem Metadata="{Binding Converter={StaticResource Converter}}"/>
    </DataTemplate>
</mvvm:ViewObject.Resources>

<Grid>
    <TabControl TabStripPlacement="Bottom">
        <TabItem Header="Clouds">
            <ListBox ItemsPanelTemplate="{StaticResource FabricTierItem}" 
                     Background="Transparent" ItemsSource="{Binding AvailableClouds}" 
                     HorizontalContentAlignment="Stretch" />
        </TabItem>
    </TabControl>
</Grid>

Вы пробовали это?

<DataTemplate DataType="{x:Type discovery:FabricTierMetadata}">
    <fabricman:FabricManInstanceItem Metadata="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}}"/>
</DataTemplate>
Другие вопросы по тегам