0

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

4

2 回答 2

1

你试过这个吗?

<DataTemplate DataType="{x:Type discovery:FabricTierMetadata}">
    <fabricman:FabricManInstanceItem Metadata="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}}"/>
</DataTemplate>
于 2013-06-05T14:59:48.083 回答
0

这应该这样做。给模板一个键并将其分配给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>
于 2013-06-05T15:02:28.443 回答