Как вы привязываетесь к элементу списка?
У меня есть 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>