问题将ObservableCollection绑定到WPF / MVVM中的ListBox

时间:2010-05-31 15:57:21

标签: wpf mvvm binding

我正在使用wpf并开始使用mvvm。到目前为止,我没有问题,当我有一个元素,我必须在屏幕上显示它的值(绑定属性的特定名称)。但现在,我必须使用属性列表,而不知道它的名称。所以我创建了一个名为GClass的类,它只有两个名称,即名称和值。我创建了ObservableCollection,现在用直接值填充,并将视图(lstview)datacontext与我创建的对象一起使用。但我看不到任何结果,它总是显示一个空白的列表框。有人能告诉我,看看为什么会这样吗?

c#代码

         VDt = new ObservableCollection<GClass>();
        var vhDt = message.SelectSingleElement(typeof (Vh)) as Vehiculo;

        if(vhDt != null)
        {
            VDt.Add(new GClass() {Name = "Numero: ", Value =  ""});
            VDt.Add(new GClass() {Name = "Marca: ", Value = ""});
            VDt.Add(new GClass() {Name = "Conductor: ", Value = ""});

            lstview.DataContext = this;
            _regionManager.RegisterViewWithRegionInIndex(RegionNames.MainRegion, lstview, 0); 

视图代码

 <ListBox Margin="5,5,5,25" ItemsSource="{Binding VDt}">
        <ListBox.Template>
            <ControlTemplate>                    
                <ListViewItem Content="{Binding Name}"></ListViewItem> 
               <ListViewItem Content="{Binding Value}"></ListViewItem>
            </ControlTemplate>
        </ListBox.Template>
    </ListBox>

我在这里有研究,但我不知道,我做错了什么。如果有人帮助我,我会感到沮丧。

1 个答案:

答案 0 :(得分:1)

这里有几件事:

首先,<ListBox.Template>允许您描述您希望如何绘制列表框本身的模板。你想要做的事(貌似)是渲染列表框中的项目,所以你需要<ListBox.ItemTemplate>

其次,在ItemTemplate中,您需要创建,而不是<ControlTemplate>,而是<DataTemplate>

最后一件事:就个人而言,我会在我的DataTemplates中使用适合用途的控件来呈现视图(例如TextBlocks而不是ListViewItems

所以你的xaml看起来应该是这样的:

<ListBox Margin="5,5,5,25" ItemsSource="{Binding VDt}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" />
                <TextBlock Text="{Binding Value}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

希望这会有所帮助:) 伊恩