我在一个页面上有一个使用控件部分中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}
一个人时,我得到了虚拟机。