【发布时间】:2016-10-27 19:13:56
【问题描述】:
我在使用 XAML 语法时遇到了一些问题,我无法理解我做错了什么。
我有一个带有 ListView 控件的简单窗口,以及一个带有 ObservableColletion 项目的简单 ViewModel。
Window 的 DataContext 设置正确,但我的问题是 ListView 的 ItemsSource 属性,当我调试应用程序时,我可以看到 ListView 具有 DataContext 权限,并且 DataContext 有一个包含 Items 的列表。
但是属性 ItemsSource 是 null,如果我在它后面的代码中设置它就可以了。
我已经搜索了一个答案,但我找不到答案,有些帖子似乎有同样的问题,但它始终是数据上下文。
这是我的代码。
XAML
<Window x:Class="XAMLExamples.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:XAMLExamples"
xmlns:vm="clr-namespace:XAMLExamples.ViewModels"
mc:Ignorable="d"
Title="Ejemplos XAML" Height="350" Width="525" Background="#FF38551F" WindowStyle="ToolWindow"
>
<Window.DataContext>
<vm:TractoViewModel/>
</Window.DataContext>
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto">
</RowDefinition>
</Grid.RowDefinitions>
<ListView ItemsSource="{Binding Path=listaAreas}" Grid.Column="0" x:Name="ListAreas">
<ListView.View>
<GridView>
<GridViewColumn Header="Area" Width="120" DisplayMemberBinding="{Binding Area}"/>
<GridViewColumn Header="Contenedores" Width="120" DisplayMemberBinding="{Binding Contenedores}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
C#
namespace XAMLExamples.ViewModels
{
public class TractoViewModel
{
public ObservableCollection<TractoModel> listaAreas = new ObservableCollection<TractoModel>();
public TractoViewModel()
{
for (int i = 0; i < 10; i++)
{
listaAreas.Add(
new TractoModel { Area= string.Format("Area {0}",i), Contenedores=i}
);
}
return;
}
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// With the following line everything is right
// this.ListAreas.ItemsSource = new XAMLExamples.ViewModels.TractoViewModel().listaAreas;
// Without the above line ItemsSource is null, even when the DataContext is right
var iSource = ListAreas.ItemsSource;
if (iSource == null) return;
}
}
【问题讨论】:
-
向我们展示
listaAreas的结构。它不仅与how-to-bind有关,而且与what-to-bind有关。 -
我无法在主窗口中看到您的数据上下文 hits.DataContext = new TractoViewModel();
标签: c# wpf xaml listview data-binding